/* * 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.jca.test; import javax.management.Attribute; import javax.management.ObjectName; import junit.framework.Test; import org.jboss.logging.Logger; import org.jboss.test.JBossTestCase; import org.jboss.test.jca.bank.interfaces.Account; import org.jboss.test.jca.bank.interfaces.Teller; import org.jboss.test.jca.bank.interfaces.TellerHome; /** * CachedConnectionBankStressTestCase.java * Tests connection disconnect-reconnect mechanism. * * Created: Mon Mar 18 07:57:41 2002 * * @author <a href="mailto:d_jencks@users.sourceforge.net">David Jencks</a> * @version */ public class CachedConnectionBankStressTestCase extends JBossTestCase { private TellerHome th; private Teller t; private Exception exc; private int iter; public CachedConnectionBankStressTestCase (String name) { super(name); } protected void setUp() throws Exception { super.setUp(); ObjectName CCM = new ObjectName("jboss.jca:service=CachedConnectionManager"); getServer().setAttribute(CCM, new Attribute("SpecCompliant", Boolean.TRUE)); th = (TellerHome)getInitialContext().lookup("Teller"); t = th.create(); t.setUp(); } protected void tearDown() throws Exception { if (t != null) { t.tearDown(); } // end of if () ObjectName CCM = new ObjectName("jboss.jca:service=CachedConnectionManager"); getServer().setAttribute(CCM, new Attribute("SpecCompliant", Boolean.FALSE)); } public static Test suite() throws Exception { return getDeploySetup(CachedConnectionBankStressTestCase.class, "jcabanktest.jar"); } public void testCachedConnectionBank() throws Exception { Account[] accounts = new Account[getThreadCount()]; for (int i = 0; i < getThreadCount(); i++) { accounts[i] = t.createAccount(new Integer(i)); } // end of for () final Object lock = new Object(); iter = 0; getLog().info("Start test. "+getThreadCount()+ " threads, "+getIterationCount()+" iterations"); long start = System.currentTimeMillis(); for (int i = 0; i < getThreadCount() - 1; i++) { //Thread.sleep(500); // Wait between each client new Thread(new TransferThread(accounts[i], accounts[(i + 1) % getThreadCount()], getIterationCount(), lock)).start(); synchronized (lock) { iter++; } } synchronized(lock) { while(iter > 0) { lock.wait(); } } if (exc != null) throw exc; for (int i = 1; i < getThreadCount() - 1; i++) { assertTrue("nonzero final balance for" + i, accounts[i].getBalance() == 0); } // end of for () long end = System.currentTimeMillis(); getLog().info("Time:"+(end-start)); getLog().info("Avg. time/call(ms):"+((end-start)/(getThreadCount()*getIterationCount()))); } public class TransferThread implements Runnable { Logger log = Logger.getLogger(getClass().getName()); Account to; Account from; int iterationCount; Object lock; public TransferThread(final Account to, final Account from, final int iterationCount, final Object lock) throws Exception { this.to = to; this.from = from; this.iterationCount = iterationCount; this.lock = lock; } public void run() { try { for (int j = 0; j < iterationCount; j++) { if (exc != null) break; t.transfer(from,to, 1); } } catch (Exception e) { exc = e; } synchronized(lock) { iter--; log.info("Only "+iter+" left"); lock.notifyAll(); } } } }// CachedConnectionSessionUnitTestCase