/*
* 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.bankiiop.test;
import java.util.Collection;
import java.util.Iterator;
import javax.rmi.PortableRemoteObject;
import junit.framework.Test;
import org.jboss.logging.Logger;
import org.jboss.test.JBossIIOPTestCase;
import org.jboss.test.bankiiop.interfaces.Account;
import org.jboss.test.bankiiop.interfaces.AccountData;
import org.jboss.test.bankiiop.interfaces.AccountHome;
import org.jboss.test.bankiiop.interfaces.Bank;
import org.jboss.test.bankiiop.interfaces.BankHome;
import org.jboss.test.bankiiop.interfaces.Customer;
import org.jboss.test.bankiiop.interfaces.CustomerHome;
import org.jboss.test.bankiiop.interfaces.Teller;
import org.jboss.test.bankiiop.interfaces.TellerHome;
/**
*
* @author Rickard Oberg
* @author Author: d_jencks among many others
* @version $Revision: 81036 $
*/
public class BankStressTestCase
extends JBossIIOPTestCase
{
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
int idx = 1;
int iter;
Exception exc;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
public BankStressTestCase(String name)
{
super(name);
}
// Public --------------------------------------------------------
public void testTeller()
throws Exception
{
TellerHome home = (TellerHome)PortableRemoteObject.narrow(
getInitialContext().lookup(TellerHome.JNDI_NAME),
TellerHome.class);
Teller teller = home.create();
BankHome bankHome = (BankHome)PortableRemoteObject.narrow(
getInitialContext().lookup(BankHome.JNDI_NAME),
BankHome.class);
Bank bank = bankHome.create();
getLog().debug("Acquire customers");
Customer marc = teller.getCustomer("Marc");
Customer rickard = teller.getCustomer("Rickard");
getLog().debug("Acquire accounts");
Account from = teller.getAccount(marc, 200);
Account to = teller.getAccount(rickard, 200);
getLog().debug("Show balance");
getLog().debug(from.getPrimaryKey()+":"+from.getBalance());
getLog().debug(to.getPrimaryKey()+":"+to.getBalance());
getLog().debug("Transfer money");
long start = System.currentTimeMillis();
int iter = 10;
for (int i = 0; i < iter; i++)
teller.transfer(from, to, 50);
long end = System.currentTimeMillis();
getLog().info("Average call time: "+((end - start) / (iter*6)));
getLog().debug("Show balance");
AccountHome accountHome = (AccountHome)PortableRemoteObject.narrow(
getInitialContext().lookup(AccountHome.JNDI_NAME),
AccountHome.class);
Collection accts = accountHome.findAll();
Iterator i = accts.iterator();
while(i.hasNext())
{
Account acct = (Account)PortableRemoteObject.narrow(i.next(),
Account.class);
AccountData data = acct.getData();
getLog().debug(data.getId()+"("+data.getOwner().getName()+"):"+data.getBalance());
acct.withdraw(data.getBalance()); // Clear
}
teller.remove();
}
public void testBank()
throws Exception
{
getLog().debug("Get code");
BankHome bankHome = (BankHome)PortableRemoteObject.narrow(
getInitialContext().lookup(BankHome.JNDI_NAME),
BankHome.class);
Bank bank = bankHome.create();
getLog().debug("Bank id="+bank.getId());
bank.remove();
}
/* public void testCustomer()
throws Exception
{
getLog().debug("Customer test----------------------------------");
getLog().debug("Create Customer");
CustomerHome customerHome = (CustomerHome)getInitialContext().lookup("Customer");
Account from, to;
try
{
from = accountHome.findByPrimaryKey("Marc");
from.deposit(200);
} catch (FinderException e)
{
from = accountHome.create("Marc", 200);
}
try
{
to = accountHome.findByPrimaryKey("Rickard");
} catch (FinderException e)
{
to = accountHome.create("Rickard", 0);
}
getLog().debug("Show balance");
getLog().debug(from.getPrimaryKey()+":"+from.getBalance());
getLog().debug(to.getPrimaryKey()+":"+to.getBalance());
getLog().debug("Transfer money");
TellerHome home = (TellerHome)getInitialContext().lookup("Teller");
Teller teller = home.create();
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++)
teller.transfer(from, to, 50);
teller.remove();
getLog().debug("Show balance");
Iterator enum = accountHome.findAll();
while(enum.hasNext())
{
Account acct = (Account)enum.next();
getLog().debug(acct.getPrimaryKey()+":"+acct.getBalance());
acct.withdraw(acct.getBalance()); // Clear
}
getLog().debug("Teller test done----------------------------------");
}
*/
public void testMultiThread()
throws Exception
{
TellerHome home = (TellerHome)PortableRemoteObject.narrow(
getInitialContext().lookup(TellerHome.JNDI_NAME),
TellerHome.class);
final Teller teller = home.create();
getLog().debug("Acquire customers");
Customer marc = teller.getCustomer("Marc");
Customer rickard = teller.getCustomer("Rickard");
getLog().debug("Acquire accounts");
final Account from = teller.getAccount(marc, 50);
final Account to = teller.getAccount(rickard, 0);
final Object lock = new Object();
iter = getThreadCount();
final int iterationCount = getIterationCount();
getLog().info("Start test. "+getThreadCount()+ " threads, "+getIterationCount()+" iterations");
long start = System.currentTimeMillis();
for (int i = 0; i < getThreadCount(); i++)
{
Thread.sleep(50);
new Thread(new Runnable()
{
public void run()
{
Logger log = Logger.getLogger(getClass().getName());
try
{
for (int j = 0; j < iterationCount; j++)
{
if (exc != null) break;
teller.transfer(from,to,50);
teller.transfer(from,to,-50);
// Thread.currentThread().yield();
// logdebug(idx++);
}
} catch (Exception e)
{
exc = e;
}
synchronized(lock)
{
iter--;
log.info("Only "+iter+" left");
lock.notifyAll();
}
}
}).start();
}
synchronized(lock)
{
while(iter>0)
{
lock.wait();
}
}
if (exc != null) throw exc;
long end = System.currentTimeMillis();
getLog().info("Show balance");
getLog().info(from.getPrimaryKey()+":"+from.getBalance());
getLog().info(to.getPrimaryKey()+":"+to.getBalance());
getLog().info("Time:"+(end-start));
getLog().info("Avg. time/call(ms):"+((end-start)/(getThreadCount()*getIterationCount()*6)));
}
/*--- commented out until I understant why this test fails with jdk 1.4 ----
public void testMultiThread2()
throws Exception
{
TellerHome home = (TellerHome)PortableRemoteObject.narrow(
getInitialContext().lookup(TellerHome.JNDI_NAME),
TellerHome.class);
final Teller teller = home.create();
getLog().debug("Acquire customers");
final Customer marc = teller.getCustomer("Marc");
final Customer rickard = teller.getCustomer("Rickard");
final Object lock = new Object();
iter = getThreadCount();
final int iterationCount = getIterationCount();
getLog().info("Start test. "+getThreadCount()+ " threads, "+getIterationCount()+" iterations");
long start = System.currentTimeMillis();
for (int i = 0; i < getThreadCount(); i++)
{
Thread.sleep(500); // Wait between each client
new Thread(new Runnable()
{
Logger log = Logger.getLogger(getClass().getName());
public void run()
{
try
{
Account from = teller.createAccount(marc, 50);
Account to = teller.createAccount(rickard, 0);
for (int j = 0; j < iterationCount; j++)
{
if (exc != null) break;
teller.transfer(from,to,50);
teller.transfer(from,to,-50);
// Thread.currentThread().yield();
// log.debug(idx++);
}
} catch (Exception e)
{
exc = e;
}
synchronized(lock)
{
iter--;
log.info("Only "+iter+" left");
lock.notifyAll();
}
}
}).start();
}
synchronized(lock)
{
while(iter>0)
{
lock.wait();
}
}
if (exc != null) throw exc;
long end = System.currentTimeMillis();
getLog().info("Time:"+(end-start));
getLog().info("Avg. time/call(ms):"+((end-start)/(getThreadCount()*getIterationCount()*6)));
}
--------------------------------------------------------------------------*/
public void testTransaction()
throws Exception
{
TellerHome home = (TellerHome)PortableRemoteObject.narrow(
getInitialContext().lookup(TellerHome.JNDI_NAME),
TellerHome.class);
Teller teller = home.create();
getLog().debug("Acquire customers");
Customer marc = teller.getCustomer("Marc");
getLog().debug("Marc acquired");
Customer rickard = teller.getCustomer("Rickard");
getLog().debug("Rickard acquired");
getLog().debug("Acquire accounts");
Account from = teller.getAccount(marc, 50);
Account to = teller.getAccount(rickard, 0);
getLog().debug("Show balance");
getLog().debug(from.getPrimaryKey()+":"+from.getBalance());
getLog().debug(to.getPrimaryKey()+":"+to.getBalance());
getLog().debug("Transfer money");
teller.transfer(from, to, 50);
getLog().debug("Transfer done");
getLog().debug("Show balance");
getLog().debug(from.getPrimaryKey()+"("+from.getOwner().getName()+"):"+from.getBalance());
getLog().debug(to.getPrimaryKey()+"("+to.getOwner().getName()+"):"+to.getBalance());
teller.remove();
}
public void testTransfer()
throws Exception
{
TellerHome home = (TellerHome)PortableRemoteObject.narrow(
getInitialContext().lookup(TellerHome.JNDI_NAME),
TellerHome.class);
Teller teller = home.create();
getLog().debug("Acquire customers");
Customer marc = teller.getCustomer("Marc");
getLog().debug("Marc acquired");
Customer rickard = teller.getCustomer("Rickard");
getLog().debug("Rickard acquired");
getLog().debug("Acquire accounts");
Account from = teller.getAccount(marc, 50*getIterationCount());
Account to = teller.getAccount(rickard, 0);
getLog().debug("Show balance");
getLog().debug(from.getPrimaryKey()+":"+from.getBalance());
getLog().debug(to.getPrimaryKey()+":"+to.getBalance());
getLog().info("Transfer money");
long start = System.currentTimeMillis();
teller.transferTest(from, to, 50, getIterationCount());
long end = System.currentTimeMillis();
getLog().info("Transfer done");
getLog().info("Total time(ms):"+(end-start));
getLog().info("Avg. time/call(ms):"+((end-start)/(getIterationCount()*2)));
getLog().debug("Show balance");
getLog().debug(from.getPrimaryKey()+":"+from.getBalance());
getLog().debug(to.getPrimaryKey()+":"+to.getBalance());
teller.remove();
}
public void testReadOnly()
throws Exception
{
TellerHome home = (TellerHome)PortableRemoteObject.narrow(
getInitialContext().lookup(TellerHome.JNDI_NAME),
TellerHome.class);
Teller teller = home.create();
getLog().debug("Acquire customers");
Customer marc = teller.getCustomer("Marc");
getLog().debug("Marc acquired");
Customer rickard = teller.getCustomer("Rickard");
getLog().debug("Rickard acquired");
getLog().debug("Acquire accounts");
Account from = teller.getAccount(marc, 50*getIterationCount());
Account to = teller.getAccount(rickard, 0);
getLog().info("Do read calls");
long start = System.currentTimeMillis();
for (int i = 0; i < getIterationCount(); i++)
{
marc.getName();
from.getBalance();
rickard.getName();
to.getBalance();
}
long end = System.currentTimeMillis();
getLog().info("Calls done");
getLog().info("Total time(ms):"+(end-start));
getLog().info("Avg. time/call(ms):"+((end-start)/(getIterationCount()*4)));
teller.remove();
}
public void testPassivation()
throws Exception
{
// Create a bunch of customers, to test passivation
CustomerHome home = (CustomerHome)PortableRemoteObject.narrow(
getInitialContext().lookup(CustomerHome.JNDI_NAME),
CustomerHome.class);
getLog().info("Create customers");
for (int i = 0; i < getIterationCount(); i++)
home.create(i+"", "Smith_"+i);
getLog().debug("Customers created");
}
public void testFinder()
throws Exception
{
//create some accounts
testPassivation();
AccountHome home = (AccountHome)PortableRemoteObject.narrow(
getInitialContext().lookup(AccountHome.JNDI_NAME),
AccountHome.class);
getLog().info("Get large accounts");
Iterator i = home.findLargeAccounts(-1).iterator();
while (i.hasNext())
{
Account acct = (Account)PortableRemoteObject.narrow(i.next(),
Account.class);
getLog().debug(acct.getOwner().getName()+":"+acct.getBalance());
}
}
protected void setUp()
throws Exception
{
super.setUp();
if (System.getSecurityManager() == null)
System.setSecurityManager(new java.rmi.RMISecurityManager());
getLog().info("Remove accounts");
{
AccountHome home = (AccountHome)PortableRemoteObject.narrow(
getInitialContext().lookup(AccountHome.JNDI_NAME),
AccountHome.class);
Collection accounts = home.findAll();
Iterator i = accounts.iterator();
while(i.hasNext())
{
Account acct = (Account)PortableRemoteObject.narrow(i.next(),
Account.class);
getLog().debug("Removing "+acct.getPrimaryKey());
acct.remove();
}
}
getLog().info("Remove customers");
{
CustomerHome home = (CustomerHome)PortableRemoteObject.narrow(
getInitialContext().lookup(CustomerHome.JNDI_NAME),
CustomerHome.class);
Collection customers = home.findAll();
Iterator i = customers.iterator();
while(i.hasNext())
{
Customer cust =
(Customer)PortableRemoteObject.narrow(i.next(),
Customer.class);
getLog().debug("Removing "+cust.getPrimaryKey());
cust.remove();
}
}
}
public static Test suite() throws Exception
{
return getDeploySetup(BankStressTestCase.class, "bankiiop.jar");
}
}