/*
* 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.perf.test;
import java.io.IOException;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.jboss.test.perf.interfaces.Entity;
import org.jboss.test.perf.interfaces.EntityPK;
import org.jboss.test.perf.interfaces.Entity2PK;
import org.jboss.test.perf.interfaces.EntityHome;
import org.jboss.test.perf.interfaces.Entity2Home;
import org.jboss.test.perf.interfaces.Probe;
import org.jboss.test.perf.interfaces.ProbeHome;
import org.jboss.test.perf.interfaces.Session;
import org.jboss.test.perf.interfaces.SessionHome;
import org.jboss.test.perf.interfaces.TxSession;
import org.jboss.test.perf.interfaces.TxSessionHome;
import org.jboss.test.JBossTestCase;
/** Test of EJB call invocation overhead.
@author Scott.Stark@jboss.org
@version $Revision: 81036 $
*/
public class PerfStressTestCase extends JBossTestCase
{
protected String CLIENT_SESSION = "perf.ClientSession";
protected String CLIENT_ENTITY = "local/perfClientEntity";
protected String PROBE = "perf.Probe";
protected String PROBE_CMT = "perf.ProbeCMT";
protected String TX_SESSION = "perf.TxSession";
protected String ENTITY = "perfEntity";
protected String ENTITY2 = "perfEntity2";
int iterationCount;
int beanCount;
public PerfStressTestCase(String name)
{
super(name);
}
public void testClientSession() throws Exception
{
getLog().debug("+++ testClientSession()");
Object obj = getInitialContext().lookup(CLIENT_SESSION);
obj = PortableRemoteObject.narrow(obj, SessionHome.class);
SessionHome home = (SessionHome) obj;
getLog().debug("Found SessionHome @ jndiName=ClientSession");
Session bean = home.create(CLIENT_ENTITY);
getLog().debug("Created ClientSession");
try
{
bean.create(0, getBeanCount());
}
catch(javax.ejb.CreateException e)
{
getLog().debug("Exception while creating entities: ", e);
}
long start = System.currentTimeMillis();
bean.read(0);
bean.read(0, getBeanCount());
bean.write(0);
bean.write(0, getBeanCount());
bean.remove(0, getBeanCount());
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug("Elapsed time = "+(elapsed / iterationCount));
}
public void testTimings() throws Exception
{
getLog().debug("+++ testTimings()");
Object obj = getInitialContext().lookup(PROBE);
obj = PortableRemoteObject.narrow(obj, ProbeHome.class);
ProbeHome home = (ProbeHome) obj;
getLog().debug("Found ProbeHome @ jndiName=Probe");
Probe bean = home.create();
getLog().debug("Created Probe");
warmup(bean);
noop(bean);
ping(bean);
echo(bean);
}
public void testTimingsCMT() throws Exception
{
getLog().debug("+++ testTimingsCMT()");
Object obj = getInitialContext().lookup(PROBE_CMT);
obj = PortableRemoteObject.narrow(obj, ProbeHome.class);
ProbeHome home = (ProbeHome) obj;
getLog().debug("Found ProbeHome @ jndiName=ProbeCMT");
Probe bean = home.create();
getLog().debug("Created ProbeCMT");
warmup(bean);
noop(bean);
ping(bean);
echo(bean);
}
public void testTxTimings() throws Exception
{
getLog().debug("+++ testTxTimings()");
Object obj = getInitialContext().lookup(TX_SESSION);
obj = PortableRemoteObject.narrow(obj, TxSessionHome.class);
TxSessionHome home = (TxSessionHome) obj;
getLog().debug("Found TxSession @ jndiName=TxSession");
TxSession bean = home.create();
getLog().debug("Created TxSession");
txRequired(bean);
txRequiresNew(bean);
txSupports(bean);
txNotSupported(bean);
requiredToSupports(bean);
requiredToMandatory(bean);
requiredToRequiresNew(bean);
}
public void testFindByPrimaryKey() throws Exception
{
getLog().debug("+++ testFindByPrimaryKey()");
Object obj = getInitialContext().lookup(ENTITY);
obj = PortableRemoteObject.narrow(obj, EntityHome.class);
EntityHome home = (EntityHome) obj;
getLog().debug("Found EntityHome @ jndiName=Entity");
EntityPK key = new EntityPK(0);
Entity bean = null;
getLog().debug("Running with " + iterationCount + " instances...");
findByPrimaryKey(key, home);
}
public void testFindByPrimaryKey2() throws Exception
{
getLog().debug("+++ testFindByPrimaryKey2()");
Object obj = getInitialContext().lookup(ENTITY2);
obj = PortableRemoteObject.narrow(obj, Entity2Home.class);
Entity2Home home = (Entity2Home) obj;
getLog().debug("Found EntityHome @ jndiName=Entity");
Entity2PK key = new Entity2PK(0, "String0", new Double(0));
Entity bean = null;
getLog().debug("Running with " + iterationCount + " instances...");
findByPrimaryKey(key, home);
}
private void warmup(Probe bean) throws Exception
{
bean.noop();
bean.ping("Ping");
bean.echo("Echo");
}
private void noop(Probe bean) throws Exception
{
getLog().debug("Starting "+iterationCount+" noop() invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
bean.noop();
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" noop() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/noop");
}
private void ping(Probe bean) throws Exception
{
getLog().debug("Starting "+iterationCount+" ping(PING) invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
bean.ping("PING");
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" ping() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/noop");
}
private void echo(Probe bean) throws Exception
{
getLog().debug("Starting "+iterationCount+" echo(ECHO) invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
{
String echo = bean.echo("ECHO");
}
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" echo() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/noop");
}
private void txRequired(TxSession bean) throws Exception
{
getLog().debug("Starting "+iterationCount+" txRequired() invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
{
String echo = bean.txRequired();
}
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" txRequired() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/txRequired");
}
private void txRequiresNew(TxSession bean) throws Exception
{
getLog().debug("Starting "+iterationCount+" txRequired() invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
{
String echo = bean.txRequiresNew();
}
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" txRequiresNew() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/txRequiresNew");
}
private void txSupports(TxSession bean) throws Exception
{
getLog().debug("Starting "+iterationCount+" txSupports() invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
{
String echo = bean.txSupports();
}
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" txSupports() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/txSupports");
}
private void txNotSupported(TxSession bean) throws Exception
{
getLog().debug("Starting "+iterationCount+" txNotSupported() invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
{
String echo = bean.txNotSupported();
}
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" txNotSupported() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/txNotSupported");
}
private void requiredToSupports(TxSession bean) throws Exception
{
getLog().debug("Starting "+iterationCount+" requiredToSupports() invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
{
String echo = bean.requiredToSupports();
}
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" requiredToSupports() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/requiredToSupports");
}
private void requiredToMandatory(TxSession bean) throws Exception
{
getLog().debug("Starting "+iterationCount+" requiredToMandatory() invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
{
String echo = bean.requiredToMandatory();
}
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" requiredToMandatory() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/requiredToMandatory");
}
private void requiredToRequiresNew(TxSession bean) throws Exception
{
getLog().debug("Starting "+iterationCount+" requiredToRequiresNew() invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
{
String echo = bean.requiredToRequiresNew();
}
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" requiredToRequiresNew() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/requiredToRequiresNew");
}
private void findByPrimaryKey(EntityPK key, EntityHome home) throws Exception
{
getLog().debug("Starting "+iterationCount+" findByPrimaryKey(key="+key+") invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
{
Entity bean = home.findByPrimaryKey(key);
}
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" findByPrimaryKey() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/findByPrimaryKey");
}
private void findByPrimaryKey(Entity2PK key, Entity2Home home) throws Exception
{
getLog().debug("Starting "+iterationCount+" findByPrimaryKey(key="+key+") invocations");
long start = System.currentTimeMillis();
for(int n = 0; n < iterationCount; n ++)
{
Entity bean = home.findByPrimaryKey(key);
}
long end = System.currentTimeMillis();
long elapsed = end - start;
getLog().debug(iterationCount+" findByPrimaryKey() invocations = "+elapsed+" ms, "+(elapsed / iterationCount)+" ms/findByPrimaryKey");
}
public static Test suite() throws Exception
{
TestSuite suite = new TestSuite();
suite.addTest(new TestSuite(PerfStressTestCase.class));
// Create an initializer for the test suite
Setup wrapper = new Setup(suite, "perf.jar", false);
return wrapper;
}
@Override
protected void setUp() throws Exception
{
super.setUp();
iterationCount = getIterationCount();
beanCount = getBeanCount();
}
}