package org.jboss.as.test.integration.ejb.async.zerotimeout;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.as.arquillian.api.ContainerResource;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* Tests calling Future on asynchronous method with zero time-out.
* Test for [ JBEAP-6826 ].
*
* @author Daniel Cihak
*/
@RunWith(Arquillian.class)
public class ZeroTimeoutAsyncMethodTestCase {
private static final String ARCHIVE_NAME = "ZeroTimeoutTestCase";
@ContainerResource
private InitialContext remoteContext;
@Deployment(name = "zerotimeouttestcase")
public static Archive<?> deploy() {
JavaArchive jar = ShrinkWrap.create(JavaArchive.class, ARCHIVE_NAME + ".jar");
jar.addClasses(ZeroTimeoutAsyncMethodTestCase.class, ZeroTimeoutAsyncBeanRemote.class, ZeroTimeoutAsyncBeanRemoteInterface.class);
return jar;
}
private <T> T lookup(Class<? extends T> beanType, Class<T> interfaceType) throws NamingException {
return interfaceType.cast(remoteContext.lookup(ARCHIVE_NAME + "/" + beanType.getSimpleName() + "!"
+ interfaceType.getName()));
}
/**
* Test call asynchronous method on remote bean with zero time-out, which means we demand the result immediately,
* but the asynchronous method invocation takes 5000 ms. Therefore the result is not available and TimeoutException is thrown.
*
* @throws Exception
*/
@Test
@RunAsClient
public void testCallAsyncFutureZeroTimeout() throws Exception {
ZeroTimeoutAsyncBeanRemoteInterface asyncBean = this.lookup(ZeroTimeoutAsyncBeanRemote.class, ZeroTimeoutAsyncBeanRemoteInterface.class);
try {
asyncBean.futureMethod().get(0, TimeUnit.MILLISECONDS);
} catch (Exception e) {
Assert.assertTrue(e instanceof TimeoutException);
}
Assert.assertTrue(asyncBean.futureMethod().get(10000, TimeUnit.MILLISECONDS));
}
}