package com.hp.mwtests.ts.jta.jts.recovery; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import javax.transaction.Status; import javax.transaction.TransactionManager; import javax.transaction.xa.XAException; import javax.transaction.xa.Xid; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.arjuna.ats.arjuna.common.Uid; import com.arjuna.ats.arjuna.common.recoveryPropertyManager; import com.arjuna.ats.arjuna.objectstore.RecoveryStore; import com.arjuna.ats.arjuna.objectstore.StoreManager; import com.arjuna.ats.arjuna.recovery.RecoveryManager; import com.arjuna.ats.arjuna.recovery.RecoveryModule; import com.arjuna.ats.arjuna.state.InputObjectState; import com.arjuna.ats.internal.arjuna.common.UidHelper; import com.arjuna.ats.internal.jta.recovery.jts.XARecoveryModule; import com.arjuna.ats.internal.jta.resources.jts.orbspecific.XAResourceRecord; import com.arjuna.ats.internal.jta.transaction.jts.TransactionManagerImple; import com.arjuna.ats.internal.jts.ORBManager; import com.arjuna.ats.internal.jts.orbspecific.recovery.RecoveryEnablement; import com.arjuna.ats.jts.common.jtsPropertyManager; import com.arjuna.orbportability.OA; import com.arjuna.orbportability.ORB; import com.arjuna.orbportability.common.opPropertyManager; import com.hp.mwtests.ts.jta.jts.common.DummyXA; /** * @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a> */ public class ResourceManagerFailureUnitTest { private ORB testORB; private OA testOA; private TransactionManager transactionManager; private RecoveryManager recoveryManager; @Before public void before() throws Exception { final Map<String, String> orbInitializationProperties = new HashMap<String, String>(); orbInitializationProperties.put("com.arjuna.orbportability.orb.PreInit1", "com.arjuna.ats.internal.jts.recovery.RecoveryInit"); opPropertyManager.getOrbPortabilityEnvironmentBean() .setOrbInitializationProperties(orbInitializationProperties); final Properties initORBProperties = new Properties(); initORBProperties.setProperty("com.sun.CORBA.POA.ORBServerId", "1"); initORBProperties.setProperty("com.sun.CORBA.POA.ORBPersistentServerPort", "" + jtsPropertyManager.getJTSEnvironmentBean().getRecoveryManagerPort()); testORB = ORB.getInstance("test"); testOA = OA.getRootOA(testORB); testORB.initORB(new String[] {}, initORBProperties); testOA.initOA(); ORBManager.setORB(testORB); ORBManager.setPOA(testOA); final List<String> recoveryExtensions = new ArrayList<String>(); recoveryExtensions.add(XARecoveryModule.class.getName()); recoveryPropertyManager.getRecoveryEnvironmentBean().setRecoveryModuleClassNames(recoveryExtensions); final List<String> recoveryActivatorClassNames = new ArrayList<String>(); recoveryActivatorClassNames.add(RecoveryEnablement.class.getName()); recoveryPropertyManager.getRecoveryEnvironmentBean() .setRecoveryActivatorClassNames(recoveryActivatorClassNames); recoveryManager = RecoveryManager.manager(RecoveryManager.DIRECT_MANAGEMENT); recoveryManager.initialize(); transactionManager = new TransactionManagerImple(); } @After public void after() throws Exception { try { if (transactionManager.getStatus() == Status.STATUS_ACTIVE) { transactionManager.rollback(); } } finally { testOA.destroy(); testORB.shutdown(); } } @Test public void test() throws Exception { transactionManager.begin(); transactionManager.getTransaction().enlistResource(new DummyXA(true)); transactionManager.getTransaction().enlistResource(new DummyXARMFail(true)); transactionManager.commit(); final int uidsCountBeforeRecovery = getUidsCount(); final RecoveryModule recoveryModule = recoveryManager.getModules().get(0); recoveryModule.periodicWorkFirstPass(); recoveryModule.periodicWorkSecondPass(); Assert.assertEquals(uidsCountBeforeRecovery - 1, getUidsCount()); } private int getUidsCount() throws Exception { final RecoveryStore recoveryStore = StoreManager.getRecoveryStore(); InputObjectState states = new InputObjectState(); int counter = 0; if (recoveryStore.allObjUids(XAResourceRecord.typeName(), states) && states.notempty()) { while (UidHelper.unpackFrom(states).notEquals(Uid.nullUid())) { counter++; } } return counter; } public static class DummyXARMFail extends DummyXA { private static boolean WAS_COMMITED; public DummyXARMFail(final boolean print) { super(print); } public void commit(Xid xid, boolean onePhase) throws XAException { super.commit(xid, onePhase); if (!WAS_COMMITED) { WAS_COMMITED = true; throw new XAException(XAException.XAER_RMFAIL); } } } }