/* * 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.security.Principal; import java.util.Properties; import javax.ejb.TimerHandle; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.naming.InitialContext; import junit.framework.TestSuite; import org.jboss.ejb.txtimer.TimerHandleImpl; 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.TimerFacade; import org.jboss.test.txtimer.interfaces.TimerFacadeHome; /** * Test the Tx timer service with an Entity. * * @author Thomas.Diesler@jboss.org * @version $Revision: 81036 $ * @since 07-Apr-2004 */ public class EntityBeanTestCase extends JBossTestCase { public EntityBeanTestCase(String name) { super(name); } public static TestSuite suite() throws Exception { TestSuite ts = new TestSuite(); ts.addTest(getDeploySetup(EntityBeanTestCase.class, "ejb-txtimer.jar")); return ts; } /** * Test that ejbTimeout is called */ public void testSingleEventDuration() throws Exception { InitialContext iniCtx = getInitialContext(); TimerEntityHome home = (TimerEntityHome) iniCtx.lookup(TimerEntityHome.JNDI_NAME); TimerEntity entity = home.create(new Integer(1)); try { entity.createTimer(500, 0, null); sleep(1000); assertEquals("unexpected call count", 1, entity.getCallCount()); } finally { entity.remove(); } } /** * Test that ejbTimeout is called once on each instance */ public void testInstanceAsscociation() throws Exception { InitialContext iniCtx = getInitialContext(); TimerEntityHome home = (TimerEntityHome) iniCtx.lookup(TimerEntityHome.JNDI_NAME); TimerEntity entity1 = home.create(new Integer(1)); TimerEntity entity2 = home.create(new Integer(2)); try { entity1.createTimer(500, 1000, null); entity2.createTimer(500, 1000, null); sleep(1000); assertEquals("unexpected call count", 1, entity1.getCallCount()); assertEquals("unexpected call count", 1, entity2.getCallCount()); } finally { entity1.remove(); entity2.remove(); } } /** * Test that ejbTimeout see the container's default principal */ public void testEjbTimeoutCallerPrincipal() throws Exception { MBeanServerConnection server = getServer(); String defaultPrincipal = (String) server.getAttribute(new ObjectName("jboss.security:service=JaasSecurityManager"), "DefaultUnauthenticatedPrincipal"); InitialContext iniCtx = getInitialContext(); TimerEntityHome home = (TimerEntityHome) iniCtx.lookup(TimerEntityHome.JNDI_NAME); TimerEntity entity = home.create(new Integer(1)); try { entity.createTimer(500, 0, null); sleep(1000); assertEquals("unexpected call count", 1, entity.getCallCount()); Principal callerPrincipal = entity.getEjbTimeoutCaller(); assertEquals("unexpected principal", defaultPrincipal, callerPrincipal.getName()); } finally { entity.remove(); } } /** * The TimerHandle sould not pass through the remote interface */ public void testReturnTimerHandle() throws Exception { InitialContext iniCtx = getInitialContext(); TimerEntityHome home = (TimerEntityHome) iniCtx.lookup(TimerEntityHome.JNDI_NAME); TimerEntity entity = home.create(new Integer(1)); try { try { TimerHandle handle = (TimerHandle) entity.createTimerReturnHandle(500); fail("TimerHandle should not pass through the remote interface: " + handle); } catch (Exception e) { assertTrue("Timer list should be empty", entity.getTimers().size() == 0); sleep(1000); assertEquals("unexpected call count", 0, entity.getCallCount()); } try { TimerHandle handle = TimerHandleImpl.parse("[[id=jboss.j2ee:jndiName=test/txtimer/TimerEntity,service=EJB,pk=1],created=10-Apr-2004 20:16:11.000,first=10-Apr-2004 20:16:11.000,periode=0]"); String retStr = entity.passTimerHandle(handle); fail("TimerHandle should not pass through the remote interface: " + retStr); } catch (Exception e) { assertTrue("Timer list should be empty", entity.getTimers().size() == 0); sleep(1000); assertEquals("unexpected call count", 0, entity.getCallCount()); } } finally { entity.remove(); } } /** * Create the timer and rollback the transaction, the timer create should be rolled back as well */ public void testRollbackAfterCreate() throws Exception { InitialContext iniCtx = getInitialContext(); TimerEntityHome entityHome = (TimerEntityHome) iniCtx.lookup(TimerEntityHome.JNDI_NAME); TimerEntity entity = entityHome.create(new Integer(1)); TimerFacadeHome facadeHome = (TimerFacadeHome) iniCtx.lookup(TimerFacadeHome.JNDI_NAME); TimerFacade facade = facadeHome.create(); try { facade.rollbackAfterCreateEntity(500); assertTrue("Timer list should be empty", entity.getTimers().size() == 0); sleep(1000); assertEquals("unexpected call count", 0, entity.getCallCount()); } finally { entity.remove(); } } /** * Cancel the timer and rollback the transaction, the timer cancel should be rolled back as well */ public void testRollbackAfterCancel() throws Exception { InitialContext iniCtx = getInitialContext(); TimerEntityHome entityHome = (TimerEntityHome) iniCtx.lookup(TimerEntityHome.JNDI_NAME); TimerEntity entity = entityHome.create(new Integer(1)); TimerFacadeHome facadeHome = (TimerFacadeHome) iniCtx.lookup(TimerFacadeHome.JNDI_NAME); TimerFacade facade = facadeHome.create(); try { entity.createTimer(500, 0, null); facade.rollbackAfterCancelEntity(); sleep(1000); assertEquals("unexpected call count", 1, entity.getCallCount()); } finally { entity.remove(); } } /** * Throw a RuntimeException in ejbTimeout, the timer should retry the invocation at least once */ public void testRetryAfterRollback() throws Exception { InitialContext iniCtx = getInitialContext(); TimerEntityHome home = (TimerEntityHome) iniCtx.lookup(TimerEntityHome.JNDI_NAME); TimerEntity entity = home.create(new Integer(1)); try { Properties props = new Properties(); props.setProperty("rollback", "true"); entity.createTimer(500, 0, props); sleep(1000); // The timer is expected to retry the invocation to ejbTimeout at least once // Note, due to bean sepuku the instance for retry should be another one as for the first attempt assertEquals("unexpected call count", 1, entity.getCallCount()); } finally { entity.remove(); } } }