djencks 2004/07/18 18:24:01
Added: modules/core/src/test/org/openejb/timer
TimerServiceImplTest.java
Log:
timer implementation
Revision Changes Path
1.1
openejb/modules/core/src/test/org/openejb/timer/TimerServiceImplTest.java
Index: TimerServiceImplTest.java
===================================================================
/* ====================================================================
* Redistribution and use of this software and associated documentation
* ("Software"), with or without modification, are permitted provided
* that the following conditions are met:
*
* 1. Redistributions of source code must retain copyright
* statements and notices. Redistributions must also contain a
* copy of this document.
*
* 2. Redistributions in binary form must reproduce this list of
* conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The name "OpenEJB" must not be used to endorse or promote
* products derived from this Software without prior written
* permission of The OpenEJB Group. For written permission,
* please contact [EMAIL PROTECTED]
*
* 4. Products derived from this Software may not be called "OpenEJB"
* nor may "OpenEJB" appear in their names without prior written
* permission of The OpenEJB Group. OpenEJB is a registered
* trademark of The OpenEJB Group.
*
* 5. Due credit should be given to the OpenEJB Project
* (http://openejb.org/).
*
* THIS SOFTWARE IS PROVIDED BY THE OPENEJB GROUP AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
* NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE OPENEJB GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the OpenEJB Project. For more information
* please see <http://openejb.org/>.
*
* ====================================================================
*/
package org.openejb.timer;
import java.io.Serializable;
import java.util.Date;
import java.util.Collection;
import javax.management.ObjectName;
import javax.transaction.TransactionManager;
import javax.ejb.Timer;
import javax.ejb.NoSuchObjectLocalException;
import EDU.oswego.cs.dl.util.concurrent.SynchronizedInt;
import junit.framework.TestCase;
import org.apache.geronimo.core.service.Interceptor;
import org.apache.geronimo.core.service.Invocation;
import org.apache.geronimo.core.service.InvocationResult;
import org.apache.geronimo.kernel.jmx.JMXUtil;
import org.apache.geronimo.pool.ThreadPool;
import org.apache.geronimo.transaction.context.TransactionContext;
import org.apache.geronimo.transaction.context.TransactionContextManager;
import org.apache.geronimo.transaction.manager.TransactionManagerImpl;
import org.apache.geronimo.timer.ExecutorTaskFactory;
import org.apache.geronimo.timer.ThreadPooledTimer;
import org.apache.geronimo.timer.TransactionalExecutorTaskFactory;
import org.apache.geronimo.timer.UserTaskFactory;
import org.apache.geronimo.timer.WorkerPersistence;
import org.apache.geronimo.timer.vm.VMWorkerPersistence;
import org.openejb.EJBInvocation;
/**
*
*
* @version $Revision: 1.1 $ $Date: 2004/07/18 22:24:01 $
*
* */
public class TimerServiceImplTest extends TestCase {
private static final long SLOP = 300L;
private static final long DELAY = 1000L;
private static final String key = "testThreadPooledTimer";
private static final String kernelName = "testKernel";
private static final ObjectName timerSourceName =
JMXUtil.getObjectName("test:type=TimerService");
private ThreadPool threadPool;
private ThreadPooledTimer threadPooledTimer;
private MockInterceptor interceptor;
private TimerServiceImpl timerService;
protected TransactionContextManager transactionContextManager;
protected ExecutorTaskFactory executableWorkFactory;
protected UserTaskFactory userTaskFactory;
private Serializable userKey = "test user info";
protected void setUp() throws Exception {
TransactionManager transactionManager = new TransactionManagerImpl();
transactionContextManager = new
TransactionContextManager(transactionManager);
executableWorkFactory = new
TransactionalExecutorTaskFactory(transactionContextManager, 1);
threadPool = new ThreadPool();
threadPool.setPoolSize(5);
threadPool.setKeepAliveTime(10000);
threadPool.setPoolName("TestPool");
threadPool.doStart();
WorkerPersistence workerPersistence = new VMWorkerPersistence();
threadPooledTimer = new ThreadPooledTimer(executableWorkFactory,
workerPersistence, threadPool);
threadPooledTimer.doStart();
TransactionContext.setContext(null);
interceptor = new MockInterceptor();
timerService = new TimerServiceImpl(new InvocationFactory(), interceptor,
threadPooledTimer, key, kernelName, timerSourceName, transactionContextManager);
}
protected void tearDown() throws Exception {
threadPooledTimer.doStop();
threadPool.doStop();
timerService = null;
}
public void testSchedule1() throws Exception {
timerService.createTimer(200L, userKey);
Thread.currentThread().sleep(200L + SLOP);
assertEquals(1, interceptor.getCount());
}
public void testSchedule2() throws Exception {
timerService.createTimer(new Date(System.currentTimeMillis() + 20L),
userKey);
Thread.currentThread().sleep(SLOP);
assertEquals(1, interceptor.getCount());
}
public void testSchedule3() throws Exception {
timerService.createTimer(200L, DELAY, userKey);
Thread.currentThread().sleep(200L + SLOP + DELAY);
assertEquals(2, interceptor.getCount());
}
public void testSchedule4() throws Exception {
timerService.createTimer(new Date(System.currentTimeMillis()), DELAY,
userKey);
Thread.currentThread().sleep(SLOP + DELAY);
assertEquals(2, interceptor.getCount());
}
public void testPersistence() throws Exception {
Timer timer = timerService.createTimer(new Date(System.currentTimeMillis()+
DELAY), DELAY, userKey);
Collection timers = timerService.getTimers();
assertEquals(1, timers.size());
assertSame(timer, timers.iterator().next());
Thread.currentThread().sleep(SLOP + DELAY);
assertEquals(1, interceptor.getCount());
threadPooledTimer.doStop();
threadPooledTimer.doStart();
timerService = new TimerServiceImpl(new InvocationFactory(), interceptor,
threadPooledTimer, key, kernelName, timerSourceName, transactionContextManager);
timerService.doStart();
Collection timers2 = timerService.getTimers();
assertEquals(1, timers2.size());
Thread.currentThread().sleep(SLOP + DELAY);
assertEquals(2, interceptor.getCount());
}
public void testCancel() throws Exception {
Timer timer = timerService.createTimer(0L, DELAY, userKey);
Thread.currentThread().sleep(SLOP + DELAY);
assertEquals(2, interceptor.getCount());
timer.cancel();
Thread.currentThread().sleep(SLOP + DELAY);
assertEquals(2, interceptor.getCount());
assertEquals(0, timerService.getTimers().size());
try {
timer.cancel();
fail("cancel should throw a NoSuchObjectLocalException");
} catch (NoSuchObjectLocalException e) {
//success
}
}
private static class InvocationFactory implements EJBTimeoutInvocationFactory {
public EJBInvocation getEJBTimeoutInvocation(TimerImpl timer) {
return null;
}
}
private static class MockInterceptor implements Interceptor {
private final SynchronizedInt counter = new SynchronizedInt(0);
public InvocationResult invoke(Invocation invocation) throws Throwable {
counter.increment();
return null;
}
public int getCount() {
return counter.get();
}
}
}