[jboss-svn-commits] JBoss Common SVN: r4321 - in arquillian/trunk: containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded and 10 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Apr 22 16:24:27 EDT 2010
Author: aslak
Date: 2010-04-22 16:24:25 -0400 (Thu, 22 Apr 2010)
New Revision: 4321
Added:
arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestDataProviderTransformer.java
arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java
Modified:
arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java
arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java
arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/AsynchronousPaymentProcessor.java
arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/MockPaymentProcessor.java
arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/SynchronousPaymentProcessor.java
arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java
arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java
arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java
arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java
arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java
arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java
arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java
arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/SecurityActions.java
arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java
arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/SecurityActions.java
Log:
ARQ-70 Added support for Method Argument Injection. setXX support for @EJB and @Resource and test method arguments for CDI
Modified: arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java
===================================================================
--- arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,7 +16,6 @@
*/
package org.jboss.arquillian.openejb;
-import java.lang.reflect.Field;
import java.util.Properties;
import javax.naming.Binding;
@@ -47,13 +46,13 @@
}
@Override
- protected Object lookupEJB(Field field) throws Exception
+ protected Object lookupEJB(Class<?> fieldType) throws Exception
{
InitialContext context = createContext();
- return lookupRecursive(field, context, context.listBindings("/"));
+ return lookupRecursive(fieldType, context, context.listBindings("/"));
}
- protected Object lookupRecursive(Field field, Context context, NamingEnumeration<Binding> contextNames) throws Exception
+ protected Object lookupRecursive(Class<?> fieldType, Context context, NamingEnumeration<Binding> contextNames) throws Exception
{
while(contextNames.hasMore())
{
@@ -62,17 +61,17 @@
if(Context.class.isInstance(value))
{
Context subContext = (Context)value;
- return lookupRecursive(field, subContext, subContext.listBindings("/"));
+ return lookupRecursive(fieldType, subContext, subContext.listBindings("/"));
}
else
{
value = context.lookup(contextName.getName());
- if(field.getType().isInstance(value))
+ if(fieldType.isInstance(value))
{
return value;
}
}
}
- throw new RuntimeException("Could not lookup EJB reference for: " + field);
+ throw new RuntimeException("Could not lookup EJB reference for: " + fieldType);
}
}
Modified: arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java
===================================================================
--- arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,6 +16,8 @@
*/
package org.jboss.arquillian.container.reloaded;
+import java.lang.reflect.Method;
+
import org.jboss.arquillian.spi.TestEnricher;
import org.jboss.beans.metadata.plugins.builder.BeanMetaDataBuilderFactory;
import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
@@ -48,6 +50,9 @@
// Required Implementations -----------------------------------------------------------||
//-------------------------------------------------------------------------------------||
+ /* (non-Javadoc)
+ * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+ */
public void enrich(final Object testCase)
{
// Obtain the server as set from the container
@@ -68,6 +73,10 @@
{
throw new RuntimeException("Could not enrich " + testCase + " by installing the instance into MC", e);
}
-
}
+
+ public Object[] resolve(Method method)
+ {
+ return new Object[method.getParameterTypes().length];
+ }
}
Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/AsynchronousPaymentProcessor.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/AsynchronousPaymentProcessor.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/AsynchronousPaymentProcessor.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,7 +16,10 @@
*/
package com.acme.cdi.payment;
+import javax.enterprise.context.RequestScoped;
+
@Asynchronous
+ at RequestScoped
public class AsynchronousPaymentProcessor implements PaymentProcessor {
public void process(String payment)
Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/MockPaymentProcessor.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/MockPaymentProcessor.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/MockPaymentProcessor.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,9 +16,11 @@
*/
package com.acme.cdi.payment;
+import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Alternative;
@Alternative @Asynchronous @Synchronous
+ at RequestScoped
public class MockPaymentProcessor implements PaymentProcessor {
public static Boolean HAS_BEEN_CALLED = false;
Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/SynchronousPaymentProcessor.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/SynchronousPaymentProcessor.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/SynchronousPaymentProcessor.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,7 +16,10 @@
*/
package com.acme.cdi.payment;
+import javax.enterprise.context.RequestScoped;
+
@Synchronous
+ at RequestScoped
public class SynchronousPaymentProcessor implements PaymentProcessor {
public void process(String payment)
Modified: arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java
===================================================================
--- arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,8 +16,6 @@
*/
package com.acme.cdi.payment;
-import javax.inject.Inject;
-
import org.jboss.arquillian.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ArchivePaths;
@@ -47,10 +45,8 @@
ArchivePaths.create("beans.xml"));
}
- @Inject @Synchronous PaymentProcessor processor;
-
@Test
- public void shouldBeReplacedByAMock() throws Exception
+ public void shouldBeReplacedByAMock(@Synchronous PaymentProcessor processor) throws Exception
{
processor.process("");
Assert.assertTrue(MockPaymentProcessor.HAS_BEEN_CALLED);
Modified: arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java
===================================================================
--- arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,8 +16,6 @@
*/
package com.acme.cdi.random;
-import javax.inject.Inject;
-
import org.jboss.arquillian.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ArchivePaths;
@@ -48,12 +46,9 @@
ArchivePaths.create("beans.xml"));
}
- @Inject @Random
- private int randomNumber;
-
@Test
- public void shouldRun() throws Exception
+ public void shouldRun(@Random int randomNumber) throws Exception
{
- Assert.assertTrue(randomNumber < 101);
+ Assert.assertTrue(randomNumber < 101);
}
}
Modified: arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java
===================================================================
--- arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,6 +16,7 @@
*/
package org.jboss.arquillian.junit;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
@@ -26,6 +27,7 @@
import org.jboss.arquillian.spi.TestMethodExecutor;
import org.jboss.arquillian.spi.TestResult;
import org.jboss.arquillian.spi.TestRunnerAdaptor;
+import org.jboss.arquillian.spi.util.TestEnrichers;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
@@ -84,6 +86,21 @@
return super.computeTestMethods();
}
+
+ /**
+ * Override to allow test methods with arguments
+ */
+ @Override
+ protected void validatePublicVoidNoArgMethods(Class<? extends Annotation> annotation, boolean isStatic, List<Throwable> errors)
+ {
+ List<FrameworkMethod> methods= getTestClass().getAnnotatedMethods(annotation);
+
+ for (FrameworkMethod eachTestMethod : methods)
+ {
+ eachTestMethod.validatePublicVoid(isStatic, errors);
+ }
+ }
+
@Override
protected Statement withBeforeClasses(final Statement originalStatement)
@@ -133,7 +150,7 @@
@Override
protected Statement withAfters(final FrameworkMethod method, final Object target, final Statement originalStatement)
{
- final Statement statementWithAfters = super.withBefores(method, target, originalStatement);
+ final Statement statementWithAfters = super.withAfters(method, target, originalStatement);
return new Statement()
{
@Override
@@ -157,7 +174,8 @@
{
public void invoke() throws Throwable
{
- method.invokeExplosively(test);
+ Object parameterValues = TestEnrichers.enrich(getMethod());
+ method.invokeExplosively(test, (Object[])parameterValues);
}
public Method getMethod()
Modified: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,17 +16,37 @@
*/
package org.jboss.arquillian.spi;
+import java.lang.reflect.Method;
+
/**
- * TestEnricher
+ * SPI used to enrich the runtime test object.
*
- * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
* @version $Revision: $
*/
public interface TestEnricher
{
/**
+ * Extension point to add features to the a Test class instance.<br/>
+ * <br/>
+ * IE. Instance field injection
+ *
+ * @param testCase The test case instance
+ */
+ void enrich(Object testCase);
+
+ /**
+ * Extension point to add features to the test method arguments.<br/>
+ * <br/>
+ * IE. Argument injection<br/>
+ * <br/>
*
- * @param testCase
+ * The return value Object[] must match the Field[] indexes.
+ * Leave Object[] index as null if it can't be handled by this {@link TestEnricher}.
+ *
+ * @param method
+ * @return A Object[] of Arguments
*/
- void enrich(Object testCase);
+ Object[] resolve(Method method);
}
Modified: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,6 +16,8 @@
*/
package org.jboss.arquillian.spi.util;
+import java.lang.reflect.Method;
+
import org.jboss.arquillian.spi.TestEnricher;
/**
@@ -28,19 +30,64 @@
*/
public class TestEnrichers
{
- private TestEnrichers() {}
+ private TestEnrichers()
+ {
+ }
- /**
+ /**
* Enrich a object based on all found TestEnricher providers.
*
- * @param testCase The object that should be enriched.
+ * @param testCase
+ * The object that should be enriched.
*/
- public static void enrich(Object testCase)
+ public static void enrich(Object testCase)
{
- DefaultServiceLoader<TestEnricher> serviceLoader = DefaultServiceLoader.load(TestEnricher.class);
- for(TestEnricher enricher : serviceLoader)
+ DefaultServiceLoader<TestEnricher> serviceLoader = DefaultServiceLoader
+ .load(TestEnricher.class);
+ for (TestEnricher enricher : serviceLoader)
{
enricher.enrich(testCase);
}
}
+
+ /**
+ * Enrich the method arguments of a method call.<br/>
+ * The Object[] index will match the method parameterType[] index.
+ *
+ * @param method
+ * @return the argument values
+ */
+ public static Object[] enrich(Method method)
+ {
+ Object[] values = new Object[method.getParameterTypes().length];
+ DefaultServiceLoader<TestEnricher> serviceLoader = DefaultServiceLoader
+ .load(TestEnricher.class);
+ for (TestEnricher enricher : serviceLoader)
+ {
+ mergeValues(values, enricher.resolve(method));
+ }
+ return values;
+ }
+
+ private static void mergeValues(Object[] values, Object[] resolvedValues)
+ {
+ if(resolvedValues == null || resolvedValues.length == 0)
+ {
+ return;
+ }
+ if(values.length != resolvedValues.length)
+ {
+ throw new IllegalStateException("TestEnricher resolved wrong argument count, expected " +
+ values.length + " returned " + resolvedValues.length);
+ }
+ for (int i = 0; i < resolvedValues.length; i++)
+ {
+ Object resvoledValue = resolvedValues[i];
+ if (resvoledValue != null && values[i] == null)
+ {
+ values[i] = resvoledValue;
+ }
+ }
+ }
+
}
Modified: arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java
===================================================================
--- arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,7 +16,11 @@
*/
package org.jboss.arquillian.testenricher.cdi;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+
import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionTarget;
import javax.naming.InitialContext;
@@ -24,7 +28,7 @@
import org.jboss.arquillian.spi.TestEnricher;
/**
- * CDIInjectionEnricher
+ * Enricher that provide JSR-299 CDI class and method argument injection.
*
* @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
* @version $Revision: $
@@ -35,6 +39,9 @@
private static final String JNDI_BEAN_MANAGER_JBOSS = "java:app/BeanManager";
private static final String ANNOTATION_NAME = "javax.inject.Inject";
+ /* (non-Javadoc)
+ * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+ */
public void enrich(Object testCase)
{
if(SecurityActions.isClassPresent(ANNOTATION_NAME))
@@ -43,6 +50,39 @@
}
}
+ /* (non-Javadoc)
+ * @see org.jboss.arquillian.spi.TestEnricher#resolve(java.lang.reflect.Method)
+ */
+ public Object[] resolve(Method method)
+ {
+ Object[] values = new Object[method.getParameterTypes().length];
+ if(SecurityActions.isClassPresent(ANNOTATION_NAME))
+ {
+ BeanManager beanManager = lookupBeanManager();
+ if(beanManager == null)
+ {
+ return values;
+ }
+ Annotation[][] parameterAnnotations = method.getParameterAnnotations();
+ Class<?>[] parameterTypes = method.getParameterTypes();
+ for(int i = 0; i < parameterTypes.length; i++)
+ {
+ Class<?> parameterType = parameterTypes[i];
+ Annotation[] parameterAnnotation = parameterAnnotations[i];
+ values[i] = getInstanceByType(beanManager, parameterType, parameterAnnotation);
+ }
+ }
+ return values;
+ }
+
+ @SuppressWarnings("unchecked")
+ private <T> T getInstanceByType(BeanManager manager, Class<T> type, Annotation... bindings)
+ {
+ final Bean<?> bean = manager.resolve(manager.getBeans(type, bindings));
+ CreationalContext<?> cc = manager.createCreationalContext(null);
+ return (T) manager.getReference(bean, type, cc);
+ }
+
protected void injectClass(Object testCase)
{
try
Modified: arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java
===================================================================
--- arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -18,17 +18,19 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.util.List;
+import javax.ejb.EJB;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.jboss.arquillian.spi.TestEnricher;
/**
- * InjectionEnricher
+ * Enricher that provide EJB class and setter method injection.
*
- * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
* @version $Revision: $
*/
public class EJBInjectionEnricher implements TestEnricher
@@ -38,6 +40,9 @@
private static final String ANNOTATION_FIELD_BEAN_INTERFACE = "beanInterface";
private static final String ANNOTATION_FIELD_MAPPED_NAME = "mappedName";
+ /* (non-Javadoc)
+ * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+ */
public void enrich(Object testCase)
{
if(SecurityActions.isClassPresent(ANNOTATION_NAME))
@@ -46,6 +51,14 @@
}
}
+ /* (non-Javadoc)
+ * @see org.jboss.arquillian.spi.TestEnricher#resolve(java.lang.reflect.Method)
+ */
+ public Object[] resolve(Method method)
+ {
+ return new Object[method.getParameterTypes().length];
+ }
+
protected void injectClass(Object testCase)
{
try
@@ -59,33 +72,52 @@
for(Field field : annotatedFields)
{
- Object ejb = lookupEJB(field);
+ Object ejb = lookupEJB(field.getType());
field.set(testCase, ejb);
}
+
+ List<Method> methods = SecurityActions.getMethodsWithAnnotation(
+ testCase.getClass(),
+ ejbAnnotation);
+
+ for(Method method : methods)
+ {
+ if(method.getParameterTypes().length != 1)
+ {
+ throw new RuntimeException("@EJB only allowed on single argument methods");
+ }
+ if(!method.getName().startsWith("set"))
+ {
+ throw new RuntimeException("@EJB only allowed on 'set' methods");
+ }
+ Object ejb = lookupEJB(method.getParameterTypes()[0]);
+ method.invoke(testCase, ejb);
+ }
+
}
catch (Exception e)
{
throw new RuntimeException("Could not inject members", e);
}
}
-
- protected Object lookupEJB(Field field) throws Exception
+
+ protected Object lookupEJB(Class<?> fieldType) throws Exception
{
// TODO: figure out test context ?
InitialContext context = createContext();
try
{
- return context.lookup("java:global/test.ear/test/" + field.getType().getSimpleName() + "Bean");
+ return context.lookup("java:global/test.ear/test/" + fieldType.getSimpleName() + "Bean");
}
catch (NamingException e)
{
try
{
- return context.lookup("test/" + field.getType().getSimpleName() + "Bean/local");
+ return context.lookup("test/" + fieldType.getSimpleName() + "Bean/local");
}
catch (NamingException e2)
{
- return context.lookup("test/" + field.getType().getSimpleName() + "Bean/remote");
+ return context.lookup("test/" + fieldType.getSimpleName() + "Bean/remote");
}
}
}
Modified: arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/SecurityActions.java
===================================================================
--- arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/SecurityActions.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/SecurityActions.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -19,6 +19,7 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
@@ -199,6 +200,30 @@
});
return declaredAccessableFields;
}
+
+ public static List<Method> getMethodsWithAnnotation(final Class<?> source, final Class<? extends Annotation> annotationClass)
+ {
+ List<Method> declaredAccessableMethods = AccessController.doPrivileged(new PrivilegedAction<List<Method>>()
+ {
+ public List<Method> run()
+ {
+ List<Method> foundMethods = new ArrayList<Method>();
+ for(Method method : source.getDeclaredMethods())
+ {
+ if(method.isAnnotationPresent(annotationClass))
+ {
+ if(!method.isAccessible())
+ {
+ method.setAccessible(true);
+ }
+ foundMethods.add(method);
+ }
+ }
+ return foundMethods;
+ }
+ });
+ return declaredAccessableMethods;
+ }
//-------------------------------------------------------------------------------||
// Inner Classes ----------------------------------------------------------------||
Modified: arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java
===================================================================
--- arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -18,6 +18,7 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.util.List;
import javax.annotation.Resource;
@@ -26,9 +27,9 @@
import org.jboss.arquillian.spi.TestEnricher;
/**
- * ResourceInjectionEnricher
+ * Enricher that provide @Resource class and method argument injection.
*
- * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
* @version $Revision: $
*/
public class ResourceInjectionEnricher implements TestEnricher
@@ -36,6 +37,9 @@
private static final String RESOURCE_LOOKUP_PREFIX = "java:/comp/env";
private static final String ANNOTATION_NAME = "javax.annotation.Resource";
+ /* (non-Javadoc)
+ * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+ */
public void enrich(Object testCase)
{
if(SecurityActions.isClassPresent(ANNOTATION_NAME))
@@ -44,6 +48,14 @@
}
}
+ /* (non-Javadoc)
+ * @see org.jboss.arquillian.spi.TestEnricher#resolve(java.lang.reflect.Method)
+ */
+ public Object[] resolve(Method method)
+ {
+ return new Object[method.getParameterTypes().length];
+ }
+
protected void injectClass(Object testCase)
{
try
@@ -60,6 +72,25 @@
Object ejb = lookup(getResourceName(field));
field.set(testCase, ejb);
}
+
+ List<Method> methods = SecurityActions.getMethodsWithAnnotation(
+ testCase.getClass(),
+ resourceAnnotation);
+
+ for(Method method : methods)
+ {
+ if(method.getParameterTypes().length != 1)
+ {
+ throw new RuntimeException("@Resource only allowed on single argument methods");
+ }
+ if(!method.getName().startsWith("set"))
+ {
+ throw new RuntimeException("@Resource only allowed on 'set' methods");
+ }
+ Object resource = lookup(getResourceName(method.getAnnotation(Resource.class)));
+ method.invoke(testCase, resource);
+ }
+
}
catch (Exception e)
{
@@ -77,6 +108,18 @@
protected String getResourceName(Field field)
{
Resource resource = field.getAnnotation(Resource.class);
+ String resourceName = getResourceName(resource);
+ if(resourceName != null)
+ {
+ return resourceName;
+ }
+ String propertyName = field.getName();
+ String className = field.getDeclaringClass().getName();
+ return RESOURCE_LOOKUP_PREFIX + "/" + className + "/" + propertyName;
+ }
+
+ protected String getResourceName(Resource resource)
+ {
String mappedName = resource.mappedName();
if (!mappedName.equals(""))
{
@@ -87,8 +130,6 @@
{
return RESOURCE_LOOKUP_PREFIX + "/" + name;
}
- String propertyName = field.getName();
- String className = field.getDeclaringClass().getName();
- return RESOURCE_LOOKUP_PREFIX + "/" + className + "/" + propertyName;
+ return null;
}
}
Modified: arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/SecurityActions.java
===================================================================
--- arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/SecurityActions.java 2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/SecurityActions.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -19,6 +19,7 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
@@ -199,7 +200,31 @@
});
return declaredAccessableFields;
}
-
+
+ public static List<Method> getMethodsWithAnnotation(final Class<?> source, final Class<? extends Annotation> annotationClass)
+ {
+ List<Method> declaredAccessableMethods = AccessController.doPrivileged(new PrivilegedAction<List<Method>>()
+ {
+ public List<Method> run()
+ {
+ List<Method> foundMethods = new ArrayList<Method>();
+ for(Method method : source.getDeclaredMethods())
+ {
+ if(method.isAnnotationPresent(annotationClass))
+ {
+ if(!method.isAccessible())
+ {
+ method.setAccessible(true);
+ }
+ foundMethods.add(method);
+ }
+ }
+ return foundMethods;
+ }
+ });
+ return declaredAccessableMethods;
+ }
+
//-------------------------------------------------------------------------------||
// Inner Classes ----------------------------------------------------------------||
//-------------------------------------------------------------------------------||
Added: arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestDataProviderTransformer.java
===================================================================
--- arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestDataProviderTransformer.java (rev 0)
+++ arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestDataProviderTransformer.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -0,0 +1,39 @@
+/**
+ *
+ */
+package org.jboss.arquillian.testng;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+import org.testng.IAnnotationTransformer;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.ITestAnnotation;
+import org.testng.internal.annotations.TestAnnotation;
+
+/**
+ * A IAnnotationTransformer that will add the {@link TestEnricherDataProvider} as {@link DataProvider}
+ * to the given test method to enable method argument injection support.
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class TestDataProviderTransformer implements IAnnotationTransformer {
+
+ /* (non-Javadoc)
+ * @see org.testng.IAnnotationTransformer#transform(org.testng.annotations.ITestAnnotation, java.lang.Class, java.lang.reflect.Constructor, java.lang.reflect.Method)
+ */
+ @SuppressWarnings("unchecked")
+ public void transform(ITestAnnotation testAnnotation, Class clazz, Constructor constructor, Method method)
+ {
+ if(testAnnotation.getDataProviderClass() == null)
+ {
+ if(testAnnotation instanceof TestAnnotation)
+ {
+ TestAnnotation annoation = (TestAnnotation)testAnnotation;
+ annoation.setDataProviderClass(TestEnricherDataProvider.class);
+ annoation.setDataProvider(TestEnricherDataProvider.PROVIDER_NAME);
+ }
+ }
+ }
+}
Added: arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java
===================================================================
--- arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java (rev 0)
+++ arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java 2010-04-22 20:24:25 UTC (rev 4321)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.testng;
+
+import java.lang.reflect.Method;
+
+import org.jboss.arquillian.spi.util.TestEnrichers;
+import org.testng.annotations.DataProvider;
+
+/**
+ * TestEnricherDataProvider
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class TestEnricherDataProvider {
+
+ public static final String PROVIDER_NAME = "enrich";
+
+ @DataProvider(name = PROVIDER_NAME)
+ public static Object[][] enrich(Method method)
+ {
+ Object[] parameterValues = TestEnrichers.enrich(method);
+ Object[][] values = new Object[1][method.getParameterTypes().length];
+ values[0] = parameterValues;
+
+ return values;
+ }
+}
More information about the jboss-svn-commits
mailing list