/*
* 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 java.net.URL;
import javax.management.ObjectName;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import junit.framework.Test;
import org.jboss.logging.Logger;
import org.jboss.mx.util.ObjectNameFactory;
import org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory;
import org.jboss.resource.connectionmanager.ConnectionListener;
import org.jboss.resource.connectionmanager.InternalManagedConnectionPool;
import org.jboss.resource.connectionmanager.JBossManagedConnectionPool;
import org.jboss.resource.connectionmanager.ManagedConnectionPool;
import org.jboss.resource.connectionmanager.NoTxConnectionManager;
import org.jboss.resource.connectionmanager.PreFillPoolSupport;
import org.jboss.test.JBossTestCase;
import org.jboss.test.jca.support.PoolHelper;
public class BackgroundValidationUnitTestCase extends JBossTestCase
{
Logger log = Logger.getLogger(PreFillPoolingUnitTestCase.class);
private static ObjectName INVALID_BACKGROUND_POOL = ObjectNameFactory.create("jboss.jca:name=TestFailedBackgroundDS,service=ManagedConnectionPool");
private static ObjectName VALID_BACKGROUND_POOL = ObjectNameFactory.create("jboss.jca:name=TestSuccessBackgroundDS,service=ManagedConnectionPool");
private static ObjectName INVALID_MATCH_POOL = ObjectNameFactory.create("jboss.jca:name=TestNonMatchDS,service=ManagedConnectionPool");
private static ObjectName VALID_MATCH_POOL = ObjectNameFactory.create("jboss.jca:name=TestValidationMatchDS,service=ManagedConnectionPool");
public BackgroundValidationUnitTestCase(String name) throws Exception
{
super(name);
}
/**
* Test for connection background validation
*
* Pool: PoolByCri
* Deployed *-ds.xml: test-background-failed-validation-ds.xml
*
* Background validation is enabled, and a connection is acquired. The FailedValidation checker
* is being used. Background validation destroys the connections in the pool and the destroyed
* count is incremented.
*
* Next, we set background validation to false, flush the pool and acquire the connection.
* Since background validation is disabled, the pool should fill to the minimum allowance.
*
* @throws Exception
*/
public void testDeployedBackgroundValidationFailure() throws Exception
{
InitialContext ctx = super.getInitialContext();
DataSource ds = (DataSource) ctx.lookup("TestFailedBackgroundDS");
ds.getConnection("sa", "").close();
Integer minCount = PoolHelper.getMinSize(getServer(), INVALID_BACKGROUND_POOL);
Long backMillis = PoolHelper.getBackgroundValMillis(getServer(), INVALID_BACKGROUND_POOL);
PoolHelper.sleepForValidation(backMillis.intValue());
Integer destroyedCount = PoolHelper.getDestroyed(getServer(), INVALID_BACKGROUND_POOL);
assertTrue("Background validation ran. Destroyed count should exceed zero.", destroyedCount.intValue() > 0);
Integer connCount = PoolHelper.getConnectionCount(getServer(), INVALID_BACKGROUND_POOL);
//assertTrue(connCount.intValue() == minCount.intValue());
PoolHelper.setPoolAttributeAndFlush(getServer(), INVALID_BACKGROUND_POOL, PoolHelper.POOL_ATT_BACKGROUND_VAL_MILLIS, new Long(0));
//Reprime the pool
ds.getConnection().close();
PoolHelper.sleepForValidation(backMillis.intValue());
destroyedCount = PoolHelper.getDestroyed(getServer(), INVALID_BACKGROUND_POOL);
connCount = PoolHelper.getConnectionCount(getServer(), INVALID_BACKGROUND_POOL);
assertTrue("Background validation is disabled. Destroyed count should be zero", destroyedCount.intValue() == 0);
assertTrue("Background validation is disabled. Pool should be filled to min", connCount.intValue() == minCount.intValue());
}
public void testDeployedBackgroundValidationSuccess() throws Exception
{
InitialContext ctx = super.getInitialContext();
DataSource ds = (DataSource) ctx.lookup("TestSuccessBackgroundDS");
ds.getConnection("sa", "").close();
Long backMillis = PoolHelper.getBackgroundValMillis(getServer(), VALID_BACKGROUND_POOL);
PoolHelper.sleepForValidation(backMillis.intValue());
Integer destroyedCount = PoolHelper.getDestroyed(getServer(), VALID_BACKGROUND_POOL);
assertTrue("Background validation ran on valid pool. Destroyed count should not exceed zero.", destroyedCount.intValue() == 0);
}
/**
* Pool: PoolByCri
* Deployed *-ds.xml: test-non-validation-match-ds.xml
*
* @throws Exception
*/
public void testDeployedNonValidateOnMatch() throws Exception
{
InitialContext ctx = super.getInitialContext();
DataSource ds = (DataSource) ctx.lookup("TestNonMatchDS");
ds.getConnection("sa", "").close();
Integer destroyed = PoolHelper.getDestroyed(getServer(), INVALID_MATCH_POOL);
assertTrue("Validation should not have occured at this point.", destroyed.intValue() == 0);
//No new-connection-sql provided, though connections are invalid, first one will
//succeed because a matchManagedConnections is not called...
ds.getConnection("sa", "").close();
destroyed = PoolHelper.getDestroyed(getServer(), INVALID_MATCH_POOL);
assertTrue(
"Validation on match is set to true for invalid connections. Destroyed count should be greater than zero.",
destroyed.intValue() > 0);
}
/**
* Pool: PoolByCri
* Deployed *-ds.xml: test-non-validation-match-ds.xml
*
* @throws Exception
*/
public void testDeployedValidateOnMatch() throws Exception
{
InitialContext ctx = super.getInitialContext();
DataSource ds = (DataSource) ctx.lookup("TestValidationMatchDS");
ds.getConnection("sa", "").close();
Integer destroyed = PoolHelper.getDestroyed(getServer(), VALID_MATCH_POOL);
assertTrue("Validation should not have occured at this point.", destroyed.intValue() == 0);
ds.getConnection("sa", "").close();
destroyed = PoolHelper.getDestroyed(getServer(), VALID_MATCH_POOL);
assertTrue("Validation on match is set to true for connections. Destroyed count should be zero.", destroyed
.intValue() == 0);
}
public void testValidateOnMatchSuccess() throws Exception
{
LocalManagedConnectionFactory mcf = new LocalManagedConnectionFactory();
mcf.setDriverClass("org.jboss.test.jca.jdbc.TestDriver");
mcf.setConnectionURL("jdbc:jboss-test-adapter");
mcf.setValidConnectionCheckerClassName("org.jboss.test.jca.support.MockSuccessValidationConnectionChecker");
mcf.setValidateOnMatch(true);
InternalManagedConnectionPool.PoolParams pp = new InternalManagedConnectionPool.PoolParams();
pp.minSize = 1;
pp.maxSize = 2;
pp.blockingTimeout = 10000;
pp.idleTimeout = 0;
pp.prefill = true;
pp.backgroundInterval = 1 * 1000 * 30;
ManagedConnectionPool mcp = new JBossManagedConnectionPool.OnePool(mcf, pp, false, log);
NoTxConnectionManager noTxn = new NoTxConnectionManager(null, mcp);
mcp.setConnectionListenerFactory(noTxn);
((PreFillPoolSupport)mcp).prefill();
//Let prefiller run
Thread.sleep(5000);
ConnectionListener cl = noTxn.getManagedConnection(null, null);
noTxn.returnManagedConnection(cl, false);
assertTrue(mcp.getConnectionDestroyedCount() == 0);
}
public void testBasicValidateOnMatchFailure() throws Exception
{
LocalManagedConnectionFactory mcf = new LocalManagedConnectionFactory();
mcf.setDriverClass("org.jboss.test.jca.jdbc.TestDriver");
mcf.setConnectionURL("jdbc:jboss-test-adapter");
mcf.setValidConnectionCheckerClassName("org.jboss.test.jca.support.MockFailedValidationConnectionChecker");
mcf.setValidateOnMatch(true);
InternalManagedConnectionPool.PoolParams pp = new InternalManagedConnectionPool.PoolParams();
pp.minSize = 1;
pp.maxSize = 2;
pp.blockingTimeout = 10000;
pp.idleTimeout = 0;
pp.prefill = true;
pp.backgroundInterval = 1 * 1000 * 30;
ManagedConnectionPool mcp = new JBossManagedConnectionPool.OnePool(mcf, pp, false, log);
NoTxConnectionManager noTxn = new NoTxConnectionManager(null, mcp);
mcp.setConnectionListenerFactory(noTxn);
((PreFillPoolSupport)mcp).prefill();
//Let prefiller run
Thread.sleep(5000);
ConnectionListener cl = noTxn.getManagedConnection(null, null);
noTxn.returnManagedConnection(cl, false);
assertTrue(mcp.getConnectionDestroyedCount() > 0);
}
public void testBasicBackgroundValidationSuccess() throws Exception
{
LocalManagedConnectionFactory mcf = new LocalManagedConnectionFactory();
mcf.setDriverClass("org.jboss.test.jca.jdbc.TestDriver");
mcf.setConnectionURL("jdbc:jboss-test-adapter");
mcf.setValidConnectionCheckerClassName("org.jboss.test.jca.support.MockSuccessValidationConnectionChecker");
InternalManagedConnectionPool.PoolParams pp = new InternalManagedConnectionPool.PoolParams();
pp.minSize = 1;
pp.maxSize = 2;
pp.blockingTimeout = 10000;
pp.idleTimeout = 0;
pp.prefill = false;
pp.backgroundInterval = 2000;
ManagedConnectionPool mcp = new JBossManagedConnectionPool.OnePool(mcf, pp, false, log);
NoTxConnectionManager noTxn = new NoTxConnectionManager(null, mcp);
mcp.setConnectionListenerFactory(noTxn);
ConnectionListener cl = noTxn.getManagedConnection(null, null);
noTxn.returnManagedConnection(cl, false);
Thread.sleep(pp.backgroundInterval);
assertTrue(mcp.getConnectionDestroyedCount() == 0);
}
public void testBasicBackgroundValidationDestroy() throws Exception
{
LocalManagedConnectionFactory mcf = new LocalManagedConnectionFactory();
mcf.setDriverClass("org.jboss.test.jca.jdbc.TestDriver");
mcf.setConnectionURL("jdbc:jboss-test-adapter");
mcf.setValidConnectionCheckerClassName("org.jboss.test.jca.support.MockFailedValidationConnectionChecker");
InternalManagedConnectionPool.PoolParams pp = new InternalManagedConnectionPool.PoolParams();
pp.minSize = 1;
pp.maxSize = 2;
pp.blockingTimeout = 10000;
pp.idleTimeout = 0;
pp.prefill = false;
pp.backgroundInterval = 2000;
ManagedConnectionPool mcp = new JBossManagedConnectionPool.OnePool(mcf, pp, false, log);
NoTxConnectionManager noTxn = new NoTxConnectionManager(null, mcp);
mcp.setConnectionListenerFactory(noTxn);
ConnectionListener cl = noTxn.getManagedConnection(null, null);
noTxn.returnManagedConnection(cl, false);
Thread.sleep(pp.backgroundInterval);
assertTrue(mcp.getConnectionDestroyedCount() > 0);
}
public static Test suite() throws Exception{
Test test1 = getDeploySetup(BackgroundValidationUnitTestCase.class, "jca-support.sar");
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL resURL = loader.getResource("jca/validation/test-background-failed-validation-ds.xml");
Test test2 = getDeploySetup(test1, resURL.toString());
resURL = loader.getResource("jca/validation/test-background-success-validation-ds.xml");
Test test3 = getDeploySetup(test2, resURL.toString());
resURL = loader.getResource("jca/validation/test-non-validation-match-ds.xml");
Test test4 = getDeploySetup(test3, resURL.toString());
resURL = loader.getResource("jca/validation/test-validation-match-ds.xml");
return getDeploySetup(test4, resURL.toString());
}
@Override
protected void setUp() throws Exception
{
super.setUp();
}
@Override
protected void tearDown() throws Exception
{
super.tearDown();
}
}