package org.javaee7.concurrency.managedexecutor; import static org.junit.Assert.assertEquals; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import javax.annotation.Resource; import javax.ejb.EJB; import javax.enterprise.concurrent.ManagedExecutorService; import javax.inject.Inject; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.asset.FileAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; /** * @author Arun Gupta */ @RunWith(Arquillian.class) public class ExecutorInjectTest { @Resource(name = "DefaultManagedExecutorService") ManagedExecutorService defaultExecutor; @Resource(name = "concurrent/myExecutor") ManagedExecutorService executorFromWebXml; @Resource ManagedExecutorService executorNoName; @EJB TestBean ejb; Callable<Product> callableTask; Runnable runnableTask; MyTaskWithListener taskWithListener; @Inject // Inject so we have a managed bean to handle the TX MyTaskWithTransaction taskWithTransaction; Collection<Callable<Product>> callableTasks = new ArrayList<>(); private static CountDownLatch latch; @Deployment public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class). addClasses(MyRunnableTask.class, MyCallableTask.class, Product.class, TestStatus.class, MyTaskWithListener.class, MyTaskWithTransaction.class, MyTransactionScopedBean.class, TestBean.class). setWebXML(new FileAsset(new File("src/main/webapp/WEB-INF/web.xml"))). addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); // Adding beans.xml shouldn't be required? WildFly Beta1 } @Before public void setup() { callableTask = new MyCallableTask(1); runnableTask = new MyRunnableTask(); taskWithListener = new MyTaskWithListener(1); for (int i = 0; i < 5; i++) { callableTasks.add(new MyCallableTask(i)); } } @Test public void testSubmitWithRunnableDefault() throws Exception { TestStatus.latch = new CountDownLatch(1); defaultExecutor.submit(runnableTask); assertTrue(TestStatus.latch.await(2000, TimeUnit.MILLISECONDS)); } @Test public void testSubmitWithCallableDefault() throws Exception { TestStatus.latch = new CountDownLatch(1); Future<Product> future = defaultExecutor.submit(callableTask); assertTrue(TestStatus.latch.await(2000, TimeUnit.MILLISECONDS)); assertEquals(1, future.get().getId()); } @Test public void testInvokeAllWithCallableDefault() throws Exception { List<Future<Product>> results = defaultExecutor.invokeAll(callableTasks); int count = 0; for (Future<Product> f : results) { assertEquals(count++, f.get().getId()); } } @Test public void testInvokeAnyWithCallableDefault() throws Exception { Product results = defaultExecutor.invokeAny(callableTasks); assertTrue(results.getId() >= 0); assertTrue(results.getId() <= 5); } @Test public void testSubmitWithRunnableNoName() throws Exception { TestStatus.latch = new CountDownLatch(1); executorNoName.submit(runnableTask); assertTrue(TestStatus.latch.await(2000, TimeUnit.MILLISECONDS)); } @Test public void testSubmitWithCallableNoName() throws Exception { TestStatus.latch = new CountDownLatch(1); Future<Product> future = executorNoName.submit(callableTask); assertTrue(TestStatus.latch.await(2000, TimeUnit.MILLISECONDS)); assertEquals(1, future.get().getId()); } @Test public void testInvokeAllWithCallableNoName() throws Exception { List<Future<Product>> results = executorNoName.invokeAll(callableTasks); int count = 0; for (Future<Product> f : results) { assertEquals(count++, f.get().getId()); } } @Test public void testInvokeAnyWithCallableNoName() throws Exception { Product results = executorNoName.invokeAny(callableTasks); assertTrue(results.getId() >= 0); assertTrue(results.getId() <= 5); } @Test public void testSubmitWithRunnableFromWebXML() throws Exception { TestStatus.latch = new CountDownLatch(1); executorFromWebXml.submit(new MyRunnableTask()); assertTrue(TestStatus.latch.await(2000, TimeUnit.MILLISECONDS)); } @Test public void testSubmitWithCallableFromWebXML() throws Exception { TestStatus.latch = new CountDownLatch(1); Future<Product> future = executorFromWebXml.submit(new MyCallableTask(1)); assertTrue(TestStatus.latch.await(2000, TimeUnit.MILLISECONDS)); assertEquals(1, future.get().getId()); } @Test public void testInvokeAllWithCallableFromWebXML() throws Exception { List<Future<Product>> results = executorFromWebXml.invokeAll(callableTasks); int count = 0; for (Future<Product> f : results) { assertEquals(count++, f.get().getId()); } } @Test public void testInvokeAnyWithCallableFromWebXML() throws Exception { Product results = executorFromWebXml.invokeAny(callableTasks); assertTrue(results.getId() >= 0); assertTrue(results.getId() <= 5); } @Test public void testSubmitWithListener() throws Exception { TestStatus.latch = new CountDownLatch(1); defaultExecutor.submit(taskWithListener); assertTrue(TestStatus.latch.await(2000, TimeUnit.MILLISECONDS)); } @Test public void testSubmitWithTransaction() throws Exception { TestStatus.latch = new CountDownLatch(1); defaultExecutor.submit(taskWithTransaction); assertTrue(TestStatus.latch.await(2000, TimeUnit.MILLISECONDS)); assertTrue(TestStatus.foundTransactionScopedBean); } @Test public void testSubmitWithEJB() throws Exception { assertTrue(ejb.doSomething()); } }