package com.hp.mwtests.ts.jta.xa; import org.junit.Test; import javax.transaction.RollbackException; import javax.transaction.xa.XAException; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; import java.util.HashSet; import java.util.Set; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class JTARMErrorCommitTest { private boolean aborted; private Set<Integer> abortedIds = new HashSet<Integer>(); @Test public void test() throws Exception { javax.transaction.TransactionManager tm = com.arjuna.ats.jta.TransactionManager .transactionManager(); tm.begin(); javax.transaction.Transaction theTransaction = tm.getTransaction(); assertTrue(theTransaction.enlistResource(new SimpleXAResource(1, true))); assertTrue(theTransaction.enlistResource(new SimpleXAResource(2, false))); try { tm.commit(); fail(); } catch (RollbackException e) { } finally { assertTrue(abortedIds.contains(new Integer(2))); assertTrue(aborted); assertTrue(abortedIds.size() == 1); } } private class SimpleXAResource implements XAResource { private final int id; private boolean fail; public SimpleXAResource(int id, boolean fail) { this.id = id; this.fail = fail; } @Override public void start(Xid xid, int flags) throws XAException { } @Override public void end(Xid xid, int flags) throws XAException { } @Override public int prepare(Xid xid) throws XAException { return 0; } @Override public void commit(Xid xid, boolean onePhase) throws XAException { if (fail) { throw new XAException(XAException.XAER_RMERR); } } @Override public void rollback(Xid xid) throws XAException { if (!fail) { aborted = true; } abortedIds.add(id); } @Override public void forget(Xid xid) throws XAException { } @Override public Xid[] recover(int flag) throws XAException { return null; } @Override public boolean isSameRM(XAResource xaRes) throws XAException { return false; } @Override public int getTransactionTimeout() throws XAException { return 0; } @Override public boolean setTransactionTimeout(int seconds) throws XAException { return false; } } }