package org.qi4j.library.framework.executor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.CountDownLatch;
import static junit.framework.Assert.assertTrue;
import org.junit.Test;
import org.qi4j.api.composite.TransientComposite;
import org.qi4j.api.mixin.Mixins;
import org.qi4j.api.sideeffect.SideEffects;
import org.qi4j.bootstrap.AssemblyException;
import org.qi4j.bootstrap.ModuleAssembly;
import org.qi4j.library.executor.ExecuteService;
import org.qi4j.library.executor.ExecuteSideEffect;
import org.qi4j.library.executor.ExecutorSideEffect;
import org.qi4j.test.AbstractQi4jTest;
/**
* JAVADOC
*/
public class ExecuteSideEffectTest
extends AbstractQi4jTest
{
private static final CountDownLatch latch = new CountDownLatch( 1 );
public void assemble( ModuleAssembly module ) throws AssemblyException
{
module.addTransients( TestComposite.class );
module.addObjects( LogCall.class );
module.addServices( ExecuteService.class ).instantiateOnStartup();
}
@Test
public void givenMethodWithAnnotationWhenCallThenExecuteSideEffect()
throws InterruptedException
{
TestComposite instance = transientBuilderFactory.newTransient( TestComposite.class );
System.out.println( instance.doStuff() );
latch.await();
assertTrue( "doStuff sideeffect called", LogCall.methodsCalled.contains( "doStuff" ) );
}
@SideEffects( ExecutorSideEffect.class )
@Mixins( TestMixin.class )
public interface TestComposite
extends TransientComposite
{
@ExecuteSideEffect( LogCall.class ) String doStuff();
}
public static abstract class TestMixin
implements TestComposite
{
public String doStuff()
{
return "Foo";
}
}
public static class LogCall
implements InvocationHandler
{
static Collection<String> methodsCalled = new ArrayList<String>();
public Object invoke( Object o, Method method, Object[] objects ) throws Throwable
{
methodsCalled.add( method.getName() );
System.out.println( "method = " + method );
latch.countDown();
return null;
}
}
}