package org.eclipse.persistence.testing.tests.failover; import java.util.List; import org.eclipse.persistence.exceptions.DatabaseException; import org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor; import org.eclipse.persistence.queries.ReadObjectQuery; import org.eclipse.persistence.sessions.DatabaseLogin; import org.eclipse.persistence.sessions.Project; import org.eclipse.persistence.sessions.server.ServerSession; import org.eclipse.persistence.testing.framework.TestCase; import org.eclipse.persistence.testing.framework.TestErrorException; import org.eclipse.persistence.testing.models.employee.domain.Address; import org.eclipse.persistence.testing.tests.failover.emulateddriver.EmulatedConnection; import org.eclipse.persistence.testing.tests.failover.emulateddriver.EmulatedDriver; /** * This test will test TopLink Failover support within a TopLink Connection pool. * It is expected that upon a connection failure TopLink will remove all broken connections * From the TopLink Pool and then reattempt connection to the datasource. * * @author gyorke * */public class FullDatabaseFailureTest extends TestCase { protected ServerSession session; public FullDatabaseFailureTest() { } protected void setup() { if (getSession().getPlatform().isSymfoware()) { throwWarning("Test FullDatabaseFailureTest is not supported on Symfoware, " + "failover has not been implemented on this platform. (bug 304908)"); } Project project = (Project)getSession().getProject().clone(); DatabaseLogin login = (DatabaseLogin)project.getLogin().clone(); login.useDirectDriverConnect(); login.setDriverClass(EmulatedDriver.class); login.setConnectionString("jdbc:emulateddriver"); project.setLogin(login); session = (ServerSession)project.createServerSession(); session.setSessionLog(getSession().getSessionLog()); session.login(); String sql = getSession().getPlatform().getPingSQL(); java.util.Vector rows = getSession().executeSQL(sql); ((EmulatedConnection)session.getAccessor().getConnection()).putRows(sql, rows); ReadObjectQuery query = new ReadObjectQuery(Address.class); getSession().executeQuery(query); sql = query.getSQLString(); rows = getSession().executeSQL(sql); ((EmulatedConnection)session.getAccessor().getConnection()).putRows(sql, rows); List list = session.getReadConnectionPool().getConnectionsAvailable(); for(int i = 0; i < list.size(); i++) { ((EmulatedConnection)((DatabaseAccessor)list.get(i)).getConnection()).causeCommError(); } } protected void test() { try { EmulatedDriver.fullFailure = true; session.acquireClientSession().readObject(Address.class); } catch(DatabaseException ex) { return; //Exception expected }finally{ EmulatedDriver.fullFailure = false; } throw new TestErrorException("Should have thrown exception as database connection is unavailable."); } public void reset() { if(session != null) { try { session.logout(); } finally { session = null; } } } }