/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.txtimer.test;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.naming.InitialContext;
import junit.framework.TestSuite;
import org.jboss.ejb.txtimer.DatabasePersistencePolicyMBean;
import org.jboss.ejb.txtimer.EJBTimerService;
import org.jboss.ejb.txtimer.PersistencePolicy;
import org.jboss.ejb.txtimer.TimedObjectId;
import org.jboss.ejb.txtimer.TimerHandleImpl;
import org.jboss.mx.util.ObjectNameFactory;
import org.jboss.test.JBossTestCase;
import org.jboss.test.txtimer.interfaces.TimerEntity;
import org.jboss.test.txtimer.interfaces.TimerEntityHome;
import org.jboss.test.txtimer.interfaces.TimerSession;
import org.jboss.test.txtimer.interfaces.TimerSessionHome;
/**
* Test the Tx timer service with an Entity.
*
* @author Thomas.Diesler@jboss.org
* @author Dimitris.Andreadis@jboss.org
* @version $Revision: 81036 $
* @since 07-Apr-2004
*/
public class PersistenceTestCase extends JBossTestCase
{
private PersistencePolicy pp;
public PersistenceTestCase(String name)
{
super(name);
}
public static TestSuite suite() throws Exception
{
TestSuite ts = new TestSuite();
ts.addTest(getDeploySetup(PersistenceTestCase.class, "ejb-txtimer.jar"));
return ts;
}
protected void setUp() throws Exception
{
super.setUp();
pp = new PersistencePolicyDelegate(getServer());
}
/**
* Test that ejbTimeout is called
*/
public void testSingleEventDuration() throws Exception
{
// check that there are no timers persisted
List timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 0, timerHandles.size());
InitialContext iniCtx = getInitialContext();
TimerEntityHome home = (TimerEntityHome)iniCtx.lookup(TimerEntityHome.JNDI_NAME);
TimerEntity entity = home.create(new Integer(1));
try
{
entity.createTimer(500, 0, null);
timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 1, timerHandles.size());
sleep(1000);
assertEquals("unexpected call count", 1, entity.getCallCount());
timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 0, timerHandles.size());
}
finally
{
entity.remove();
}
}
/**
* Insert a timer for an EB and fake rstore after server startup
*/
public void testRestoreToEntity() throws Exception
{
// check that there are no timers persisted
List timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 0, timerHandles.size());
InitialContext iniCtx = getInitialContext();
TimerEntityHome home = (TimerEntityHome)iniCtx.lookup(TimerEntityHome.JNDI_NAME);
TimerEntity entity = home.create(new Integer(1));
try
{
// insert a timer into the db
ObjectName oname = ObjectNameFactory.create("jboss.j2ee:jndiName=test/txtimer/TimerEntity,service=EJB");
TimedObjectId targetId = new TimedObjectId(oname, new Integer(1));
pp.insertTimer("pk1", targetId, new Date(), 0, null);
sleep(500);
timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 1, timerHandles.size());
// fake restore on server startup
// we cannot test that the PersistencePolicy is notified after startup
try
{
getServer().invoke(
EJBTimerService.OBJECT_NAME,
"restoreTimers",
new Object[] { oname, null },
new String[]{"javax.management.ObjectName", "java.lang.ClassLoader" }
);
}
catch (Exception e)
{
log.warn("Could not restore ejb timers", e);
}
sleep(500);
assertEquals("unexpected call count", 1, entity.getCallCount());
timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 0, timerHandles.size());
}
finally
{
entity.remove();
}
}
/**
* Insert a timer for a SLSB and fake rstore after server startup
*/
public void testRestoreToSession() throws Exception
{
// check that there are no timers persisted
List timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 0, timerHandles.size());
InitialContext iniCtx = getInitialContext();
TimerSessionHome home = (TimerSessionHome)iniCtx.lookup(TimerSessionHome.JNDI_NAME);
TimerSession session = home.create();
session.resetCallCount();
try
{
// insert a timer into the db
ObjectName oname = ObjectNameFactory.create("jboss.j2ee:jndiName=test/txtimer/TimerSession,service=EJB");
TimedObjectId targetId = new TimedObjectId(oname);
pp.insertTimer("pk1", targetId, new Date(), 0, null);
sleep(500);
timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 1, timerHandles.size());
// fake restore on server startup
// we cannot test that the PersistencePolicy is notified after startup
try
{
getServer().invoke(
EJBTimerService.OBJECT_NAME,
"restoreTimers",
new Object[] { oname, null },
new String[]{"javax.management.ObjectName", "java.lang.ClassLoader" }
);
}
catch (Exception e)
{
log.warn("Could not restore ejb timers", e);
}
sleep(500);
assertEquals("unexpected call count", 1, session.getGlobalCallCount());
timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 0, timerHandles.size());
}
finally
{
session.remove();
}
}
/**
* Test the database roundtrip
*/
public void testPersistenceEquality() throws Exception
{
// check that there are no timers persisted
List timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 0, timerHandles.size());
// insert a timer into the db
String timerId = "pk1";
ObjectName oname = ObjectNameFactory.create("jboss.j2ee:jndiName=test/txtimer/TimerEntity,service=EJB");
TimedObjectId targetId = new TimedObjectId(oname, new Integer(100));
Date firstEvent = new Date ();
String info = "info";
pp.insertTimer(timerId, targetId, firstEvent, 100, info);
timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 1, timerHandles.size());
TimerHandleImpl handle = (TimerHandleImpl)timerHandles.get(0);
assertEquals("TimerId is not equal", timerId, handle.getTimerId());
assertEquals("TimedObjectId is not equal", targetId, handle.getTimedObjectId());
assertEquals("firstEvent is not equal", firstEvent, handle.getFirstTime());
assertEquals("periode is not equal", 100, handle.getPeriode());
assertEquals("info is not equal", info, handle.getInfo());
pp.clearTimers();
timerHandles = pp.listTimerHandles();
assertEquals("unexpected handle count", 0, timerHandles.size());
}
/**
* Make the invokations to the MBeanConnection typesafe
*/
static class PersistencePolicyDelegate implements PersistencePolicy
{
DatabasePersistencePolicyMBean proxy;
public PersistencePolicyDelegate(MBeanServerConnection server)
{
proxy = (DatabasePersistencePolicyMBean)
MBeanServerInvocationHandler.newProxyInstance(server,
DatabasePersistencePolicyMBean.OBJECT_NAME,
DatabasePersistencePolicyMBean.class, false);
}
public void insertTimer(String timerId, TimedObjectId targetId, Date firstEvent, long periode, Serializable info)
{
try
{
proxy.insertTimer(timerId, targetId, firstEvent, periode, info);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public void deleteTimer(String timerId, TimedObjectId targetId)
{
try
{
proxy.deleteTimer(timerId, targetId);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public void clearTimers()
{
try
{
proxy.clearTimers();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public void restoreTimers()
{
try
{
proxy.resetAndRestoreTimers();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public List listTimerHandles(ObjectName containerId, ClassLoader loader)
{
List list = null;
try
{
list = proxy.listTimerHandles(containerId, loader);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
return list;
}
public List listTimerHandles()
{
List list = null;
try
{
list = proxy.listTimerHandles();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
return list;
}
}
}