package org.jboss.as.test.integration.ejb.timerservice.cancelation; import java.util.concurrent.TimeUnit; import javax.ejb.TimerHandle; import javax.naming.InitialContext; import javax.naming.NamingException; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; 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; /** * Test that timer cancellation works as expected, even when there is a race between the timeout method and the * cancellation itself * * * @author Stuart Douglas */ @RunWith(Arquillian.class) public class TimerServiceCancellationTestCase { // countlatchdown waiting time private static int TIMER_CALL_WAITING_S = 30; @Deployment public static Archive<?> deploy() { JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "timerCancelTest.jar"); jar.addPackage(TimerServiceCancellationTestCase.class.getPackage()); return jar; } @Test public void testCancelSimpleWhileTimeoutActive() throws NamingException, InterruptedException { InitialContext ctx = new InitialContext(); SimpleTimerServiceBean bean = (SimpleTimerServiceBean)ctx.lookup("java:module/" + SimpleTimerServiceBean.class.getSimpleName()); TimerHandle handle = bean.createTimer(); Assert.assertTrue(bean.getTimerEntry().await(TIMER_CALL_WAITING_S, TimeUnit.SECONDS)); //now the timeout is in progress cancel the timer handle.getTimer().cancel(); bean.getTimerExit().countDown(); Assert.assertFalse(SimpleTimerServiceBean.quickAwaitTimerCall()); Assert.assertEquals(0, bean.getTimerCount()); } @Test public void testCancelCalendarWhileTimeoutActive() throws NamingException, InterruptedException { InitialContext ctx = new InitialContext(); CalendarTimerServiceBean bean = (CalendarTimerServiceBean)ctx.lookup("java:module/" + CalendarTimerServiceBean.class.getSimpleName()); TimerHandle handle = bean.createTimer(); Assert.assertTrue(bean.getTimerEntry().await(TIMER_CALL_WAITING_S, TimeUnit.SECONDS)); //now the timeout is in progress cancel the timer handle.getTimer().cancel(); bean.getTimerExit().countDown(); Assert.assertFalse(CalendarTimerServiceBean.quickAwaitTimerCall()); Assert.assertEquals(0, bean.getTimerCount()); } }