1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
/*
* Bitronix Transaction Manager
*
* Copyright (c) 2010, Bitronix Software.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program 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 distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package bitronix.tm;
import java.sql.SQLException;
import junit.framework.TestCase;
import bitronix.tm.mock.resource.jdbc.*;
import bitronix.tm.recovery.*;
import bitronix.tm.resource.ResourceRegistrar;
import bitronix.tm.resource.jdbc.PoolingDataSource;
/**
*
* @author lorban
*/
public class JdbcFailedPoolTest extends TestCase {
protected void setUp() throws Exception {
TransactionManagerServices.getJournal().open();
TransactionManagerServices.getTaskScheduler();
}
protected void tearDown() throws Exception {
TransactionManagerServices.getJournal().close();
TransactionManagerServices.getTaskScheduler().shutdown();
}
public void testAcquiringConnectionAfterRecoveryDoesNotMarkAsFailed() throws Exception {
PoolingDataSource poolingDataSource = new PoolingDataSource();
poolingDataSource.setClassName(MockitoXADataSource.class.getName());
poolingDataSource.setUniqueName("ds1");
poolingDataSource.setMaxPoolSize(1);
poolingDataSource.setMaxIdleTime(1); // set low shrink timeout
poolingDataSource.init();
IncrementalRecoverer.recover(poolingDataSource);
MockitoXADataSource.setStaticGetXAConnectionException(new SQLException("creating a new connection does not work"));
Thread.sleep(2000); // wait for shrink
// should not work but should not mark the pool as failed as it could recover
try {
poolingDataSource.getConnection();
fail("expected SQLException");
} catch (SQLException ex) {
assertEquals("unable to get a connection from pool of a PoolingDataSource containing an XAPool of resource ds1 with 0 connection(s) (0 still available)", ex.getMessage());
}
poolingDataSource.close();
}
public void testFailingRecoveryMarksAsFailed() throws Exception {
MockitoXADataSource.setStaticGetXAConnectionException(new SQLException("creating a new connection does not work"));
PoolingDataSource poolingDataSource = new PoolingDataSource();
poolingDataSource.setClassName(MockitoXADataSource.class.getName());
poolingDataSource.setUniqueName("ds1");
poolingDataSource.setMaxPoolSize(1);
poolingDataSource.init();
// try {
// IncrementalRecoverer.recover(poolingDataSource);
// fail("expected RecoveryException");
// } catch (RecoveryException ex) {
// assertEquals("cannot start recovery on a PoolingDataSource containing an XAPool of resource ds1 with 0 connection(s) (0 still available)", ex.getMessage());
// }
//
// assertEquals("a PoolingDataSource containing an XAPool of resource ds1 with 0 connection(s) (0 still available) -failed-", poolingDataSource.toString());
Recoverer recoverer = new Recoverer();
recoverer.run();
assertEquals("a PoolingDataSource containing an XAPool of resource ds1 with 0 connection(s) (0 still available) -failed-", poolingDataSource.toString());
// recoverer must not unregister the resource
assertSame(poolingDataSource, ResourceRegistrar.get("ds1"));
MockitoXADataSource.setStaticGetXAConnectionException(null);
recoverer.run();
assertEquals("a PoolingDataSource containing an XAPool of resource ds1 with 1 connection(s) (1 still available)", poolingDataSource.toString());
// recoverer must not unregister the resource
assertSame(poolingDataSource, ResourceRegistrar.get("ds1"));
poolingDataSource.close();
}
public void testSuccessfulRecoveryMarksAsNotFailed() throws Exception {
MockitoXADataSource.setStaticGetXAConnectionException(new SQLException("creating a new connection does not work"));
PoolingDataSource poolingDataSource = new PoolingDataSource();
poolingDataSource.setClassName(MockitoXADataSource.class.getName());
poolingDataSource.setUniqueName("ds1");
poolingDataSource.setMaxPoolSize(1);
poolingDataSource.init();
try {
IncrementalRecoverer.recover(poolingDataSource);
fail("expected RecoveryException");
} catch (RecoveryException ex) {
assertEquals("cannot start recovery on a PoolingDataSource containing an XAPool of resource ds1 with 0 connection(s) (0 still available)", ex.getMessage());
}
assertEquals("a PoolingDataSource containing an XAPool of resource ds1 with 0 connection(s) (0 still available) -failed-", poolingDataSource.toString());
MockitoXADataSource.setStaticGetXAConnectionException(null);
Recoverer recoverer = new Recoverer();
recoverer.run();
assertEquals("a PoolingDataSource containing an XAPool of resource ds1 with 1 connection(s) (1 still available)", poolingDataSource.toString());
// recoverer must not unregister the resource
assertSame(poolingDataSource, ResourceRegistrar.get("ds1"));
poolingDataSource.close();
}
}
|