package org.jboss.as.test.integration.ejb.timerservice.count;
import java.io.Serializable;
import java.util.Collection;
import javax.ejb.Timer;
import javax.naming.InitialContext;
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.EnterpriseArchive;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Testcase for the {@link javax.ejb.TimerService#getAllTimers()} API introduced in EJB 3.2 spec
*
* @author: Jaikiran Pai
*/
@RunWith(Arquillian.class)
public class ActiveTimerServiceCountTestCase {
private static final String APP_NAME = "ejb-3.2-active-timers";
private static final String MODULE_ONE_NAME = "ejb-3.2-active-timers-one";
private static final String MODULE_TWO_NAME = "ejb-3.2-active-timers-two";
@Deployment
public static Archive createDeployment() {
final JavaArchive ejbJarOne = ShrinkWrap.create(JavaArchive.class, MODULE_ONE_NAME + ".jar");
ejbJarOne.addClasses(ActiveTimerServiceCountTestCase.class, SimpleTimerBean.class, OtherTimerBeanInSameModule.class, StatefulBean.class);
final JavaArchive ejbJarTwo = ShrinkWrap.create(JavaArchive.class, MODULE_TWO_NAME + ".jar");
ejbJarTwo.addClasses(TimerBeanInOtherModule.class);
final EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class, APP_NAME + ".ear");
ear.addAsModules(ejbJarOne, ejbJarTwo);
return ear;
}
/**
* Tests that the {@link javax.ejb.TimerService#getAllTimers()} API introduced in EJB 3.2 works as expected
*
* @throws Exception
*/
@Test
public void testActiveTimersCountInEJBModule() throws Exception {
final SimpleTimerBean timerBean = InitialContext.doLookup("java:module/" + SimpleTimerBean.class.getSimpleName() + "!" + SimpleTimerBean.class.getName());
final String infoOne = "gangnam style";
timerBean.createTimerForNextDay(false, infoOne);
final String infoTwo = "PSY";
timerBean.createTimerForNextDay(true, infoTwo);
final OtherTimerBeanInSameModule otherTimerBean = InitialContext.doLookup("java:module/" + OtherTimerBeanInSameModule.class.getSimpleName() + "!" + OtherTimerBeanInSameModule.class.getName());
final String infoThree = "hello world!";
otherTimerBean.createTimerForNextDay(false, infoThree);
final TimerBeanInOtherModule timerBeanInOtherModule = InitialContext.doLookup("java:global/" + APP_NAME + "/" + MODULE_TWO_NAME + "/" + TimerBeanInOtherModule.class.getSimpleName() + "!" + TimerBeanInOtherModule.class.getName());
final String infoForTimerBeanInOtherModule = "irrelevant";
timerBeanInOtherModule.createTimerForNextDay(false, infoForTimerBeanInOtherModule);
final Collection<Timer> activeTimers = timerBean.getAllActiveTimersInEJBModule();
// now start testing
Assert.assertFalse("No active timers found in EJB module " + MODULE_ONE_NAME, activeTimers.isEmpty());
// now make sure that the active timers are indeed the one we expected
Assert.assertTrue("@Schedule timer on " + SimpleTimerBean.class.getSimpleName() + " not found in active timers", this.removeSheduleOneTimerOfSimpleTimerBean(activeTimers));
Assert.assertTrue("@Schedule timer on " + SimpleTimerBean.class.getSimpleName() + " not found in active timers", this.removeSheduleTwoTimerOfSimpleTimerBean(activeTimers));
Assert.assertTrue("@Schedule timer on " + OtherTimerBeanInSameModule.class.getSimpleName() + " not found in active timers", this.removeSheduleOneTimerOfOtherTimerBean(activeTimers));
Assert.assertTrue("Programmatic timer on " + SimpleTimerBean.class.getSimpleName() + " not found in active timers", this.removeProgramaticTimer(activeTimers, infoOne, false));
Assert.assertTrue("Programmatic timer on " + SimpleTimerBean.class.getSimpleName() + " not found in active timers", this.removeProgramaticTimer(activeTimers, infoTwo, true));
Assert.assertTrue("Programmatic timer on " + OtherTimerBeanInSameModule.class.getSimpleName() + " not found in active timers", this.removeProgramaticTimer(activeTimers, infoThree, false));
// make sure there isn't an unexpected timer in the active timers
for (final Timer remainingTimer : activeTimers) {
Assert.assertNotEquals("Unexpectedly found a timer from other EJB module " + MODULE_TWO_NAME, TimerBeanInOtherModule.SCHEDULE_ONE_INFO.equals(remainingTimer.getInfo()));
Assert.assertNotEquals("Unexpectedly found a timer from other EJB module " + MODULE_TWO_NAME, infoForTimerBeanInOtherModule.equals(remainingTimer.getInfo()));
}
// Now fetch the same info, this time from the SFSB. We expect the same number of active timers in the module.
final StatefulBean statefulBean = InitialContext.doLookup("java:module/" + StatefulBean.class.getSimpleName() + "!" + StatefulBean.class.getName());
final Collection<Timer> activeTimersReturnedFromSFSB = statefulBean.getAllActiveTimersInEJBModule();
Assert.assertFalse("No active timers found in EJB module " + MODULE_ONE_NAME + " when queried from a stateful bean", activeTimersReturnedFromSFSB.isEmpty());
// now make sure that the active timers are indeed the one we expected
Assert.assertTrue("@Schedule timer on " + SimpleTimerBean.class.getSimpleName() + " not found in active timers when queried from a stateful bean", this.removeSheduleOneTimerOfSimpleTimerBean(activeTimersReturnedFromSFSB));
Assert.assertTrue("@Schedule timer on " + SimpleTimerBean.class.getSimpleName() + " not found in active timers when queried from a stateful bean", this.removeSheduleTwoTimerOfSimpleTimerBean(activeTimersReturnedFromSFSB));
Assert.assertTrue("@Schedule timer on " + OtherTimerBeanInSameModule.class.getSimpleName() + " not found in active timers when queried from a stateful bean", this.removeSheduleOneTimerOfOtherTimerBean(activeTimersReturnedFromSFSB));
Assert.assertTrue("Programmatic timer on " + SimpleTimerBean.class.getSimpleName() + " not found in active timers when queried from a stateful bean", this.removeProgramaticTimer(activeTimersReturnedFromSFSB, infoOne, false));
Assert.assertTrue("Programmatic timer on " + SimpleTimerBean.class.getSimpleName() + " not found in active timers when queried from a stateful bean", this.removeProgramaticTimer(activeTimersReturnedFromSFSB, infoTwo, true));
Assert.assertTrue("Programmatic timer on " + OtherTimerBeanInSameModule.class.getSimpleName() + " not found in active timers when queried from a stateful bean", this.removeProgramaticTimer(activeTimersReturnedFromSFSB, infoThree, false));
// make sure there isn't an unexpected timer in the active timers
for (final Timer remainingTimer : activeTimersReturnedFromSFSB) {
Assert.assertNotEquals("Unexpectedly found a timer from other EJB module " + MODULE_TWO_NAME + " when queried from a stateful bean", TimerBeanInOtherModule.SCHEDULE_ONE_INFO.equals(remainingTimer.getInfo()));
Assert.assertNotEquals("Unexpectedly found a timer from other EJB module " + MODULE_TWO_NAME + " when queried from a stateful bean", infoForTimerBeanInOtherModule.equals(remainingTimer.getInfo()));
}
}
private boolean removeSheduleOneTimerOfSimpleTimerBean(final Collection<Timer> timers) {
for (final Timer activeTimer : timers) {
// see if it's @Schedule one in SimpleTimerBean
final Serializable info = activeTimer.getInfo();
if (SimpleTimerBean.SCHEDULE_ONE_INFO.equals(info)) {
Assert.assertTrue("Unexpected timer type of timer on " + SimpleTimerBean.class.getSimpleName(), activeTimer.isCalendarTimer());
Assert.assertFalse("Unexpected persistence type of timer on " + SimpleTimerBean.class.getSimpleName(), activeTimer.isPersistent());
// remove this matched timer from the collection
return timers.remove(activeTimer);
}
}
return false;
}
private boolean removeSheduleTwoTimerOfSimpleTimerBean(final Collection<Timer> timers) {
for (final Timer activeTimer : timers) {
// see if it's @Schedule two in SimpleTimerBean
final Serializable info = activeTimer.getInfo();
if (SimpleTimerBean.SCHEDULE_TWO_INFO.equals(info)) {
Assert.assertTrue("Unexpected timer type of timer on " + SimpleTimerBean.class.getSimpleName(), activeTimer.isCalendarTimer());
Assert.assertTrue("Unexpected persistence type of timer on " + SimpleTimerBean.class.getSimpleName(), activeTimer.isPersistent());
// remove this matched timer from the collection
return timers.remove(activeTimer);
}
}
return false;
}
private boolean removeSheduleOneTimerOfOtherTimerBean(final Collection<Timer> timers) {
for (final Timer activeTimer : timers) {
// see if it's @Schedule one in OtherTimerBeanInSameModule
final Serializable info = activeTimer.getInfo();
if (OtherTimerBeanInSameModule.SCHEDULE_ONE_INFO.equals(info)) {
Assert.assertTrue("Unexpected timer type of timer on " + OtherTimerBeanInSameModule.class.getSimpleName(), activeTimer.isCalendarTimer());
Assert.assertFalse("Unexpected persistence type of timer on " + OtherTimerBeanInSameModule.class.getSimpleName(), activeTimer.isPersistent());
// remove this matched timer from the collection
return timers.remove(activeTimer);
}
}
return false;
}
private boolean removeProgramaticTimer(final Collection<Timer> timers, final String timerInfo, final boolean persistent) {
for (final Timer activeTimer : timers) {
// see if it's the programatic timer we are looking for
final Serializable info = activeTimer.getInfo();
if (timerInfo.equals(info)) {
Assert.assertFalse("Unexpected timer type of timer", activeTimer.isCalendarTimer());
Assert.assertEquals("Unexpected persistence type of timer", persistent, activeTimer.isPersistent());
// remove this matched timer from the collection
return timers.remove(activeTimer);
}
}
return false;
}
}