GERONIMO-5289 add some heuristic tests, and fix everCommit test
git-svn-id: https://svn.apache.org/repos/asf/geronimo/components/txmanager/trunk@942259 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/CommitTask.java b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/CommitTask.java
index ea8dda6..af245ec 100644
--- a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/CommitTask.java
+++ b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/CommitTask.java
@@ -68,6 +68,7 @@
try {
try {
manager.getCommitter().commit(manager.getBranchId(), false);
+ evercommit = true;
i.remove();
} catch (XAException e) {
log.error("Unexpected exception committing " + manager.getCommitter() + "; continuing to commit other RMs", e);
diff --git a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java
index f5c4403..6811227 100644
--- a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java
+++ b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java
@@ -757,7 +757,7 @@
XAException cause = commitTask.getCause();
boolean evercommit = commitTask.isEvercommit();
if (cause != null) {
- if (cause.errorCode == XAException.XA_HEURRB&& !evercommit) {
+ if (cause.errorCode == XAException.XA_HEURRB && !evercommit) {
throw (HeuristicRollbackException) new HeuristicRollbackException("Error during two phase commit").initCause(cause);
} else if (cause.errorCode == XAException.XA_HEURRB && evercommit) {
throw (HeuristicMixedException) new HeuristicMixedException("Error during two phase commit").initCause(cause);
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/HeuristicTest.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/HeuristicTest.java
new file mode 100644
index 0000000..b0e2683
--- /dev/null
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/HeuristicTest.java
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package org.apache.geronimo.transaction.manager;
+
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.xa.XAException;
+import junit.framework.TestCase;
+
+/**
+ * Test all combinations of heuristic error codes except XA_HEURHAZ
+ * @version $Rev$ $Date$
+ */
+public class HeuristicTest extends TestCase {
+
+ TransactionLog transactionLog = new MockLog();
+
+ TransactionManagerImpl tm;
+
+ protected void setUp() throws Exception {
+ tm = new TransactionManagerImpl(10,
+ new XidFactoryImpl("WHAT DO WE CALL IT?".getBytes()), transactionLog);
+ }
+
+ protected void tearDown() throws Exception {
+ tm = null;
+ }
+
+ public void test_C_C() throws Exception {
+ expectSuccess(0,0);
+ }
+ public void test_C_HC() throws Exception {
+ expectSuccess(0,XAException.XA_HEURCOM);
+ }
+ public void test_C_HM() throws Exception {
+ expectHeuristicMixedException(0, XAException.XA_HEURMIX);
+ }
+ public void test_C_HR() throws Exception {
+ expectHeuristicMixedException(0, XAException.XA_HEURRB);
+ }
+
+ public void test_HC_C() throws Exception {
+ expectSuccess(XAException.XA_HEURCOM,0);
+ }
+ public void test_HC_HC() throws Exception {
+ expectSuccess(XAException.XA_HEURCOM, XAException.XA_HEURCOM);
+ }
+ public void test_HC_HM() throws Exception {
+ expectHeuristicMixedException(XAException.XA_HEURCOM, XAException.XA_HEURMIX);
+ }
+ public void test_HC_HR() throws Exception {
+ expectHeuristicMixedException(XAException.XA_HEURCOM, XAException.XA_HEURRB);
+ }
+
+ public void test_HM_C() throws Exception {
+ expectHeuristicMixedException(XAException.XA_HEURMIX, 0);
+ }
+ public void test_HM_HC() throws Exception {
+ expectHeuristicMixedException(XAException.XA_HEURMIX, XAException.XA_HEURCOM);
+ }
+ public void test_HM_HM() throws Exception {
+ expectHeuristicMixedException(XAException.XA_HEURMIX, XAException.XA_HEURMIX);
+ }
+ public void test_HM_HR() throws Exception {
+ expectHeuristicMixedException(XAException.XA_HEURMIX, XAException.XA_HEURRB);
+ }
+
+
+ public void test_HR_C() throws Exception {
+ expectHeuristicMixedException(XAException.XA_HEURRB, 0);
+ }
+ public void test_HR_HC() throws Exception {
+ expectHeuristicMixedException(XAException.XA_HEURRB, XAException.XA_HEURCOM);
+ }
+ public void test_HR_HM() throws Exception {
+ expectHeuristicMixedException(XAException.XA_HEURRB, XAException.XA_HEURMIX);
+ }
+ public void test_HR_HR() throws Exception {
+ expectHeuristicRollbackException(XAException.XA_HEURRB, XAException.XA_HEURRB);
+ }
+
+
+ public void expectSuccess(int first, int second) throws Exception {
+ tm.begin();
+ tm.getTransaction().enlistResource(new MockResource("1", first));
+ tm.getTransaction().enlistResource(new MockResource("2", second));
+ tm.commit();
+ }
+ public void expectHeuristicMixedException(int first, int second) throws Exception {
+ tm.begin();
+ tm.getTransaction().enlistResource(new MockResource("1", first));
+ tm.getTransaction().enlistResource(new MockResource("2", second));
+ try {
+ tm.commit();
+ fail();
+ } catch (HeuristicMixedException e) {
+ //expected
+ }
+ }
+ public void expectHeuristicRollbackException(int first, int second) throws Exception {
+ tm.begin();
+ tm.getTransaction().enlistResource(new MockResource("1", first));
+ tm.getTransaction().enlistResource(new MockResource("2", second));
+ try {
+ tm.commit();
+ fail();
+ } catch (HeuristicRollbackException e) {
+ //expected
+ }
+ }
+
+}
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResource.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResource.java
index f9baf9d..0152d57 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResource.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResource.java
@@ -36,15 +36,22 @@
private boolean prepared;
private boolean committed;
private boolean rolledback;
- private Set preparedXids = new HashSet();
- private Set knownXids = new HashSet();
- private Set finishedXids = new HashSet();//end was called with TMSUCCESS or TMFAIL
+ private Set<Xid> preparedXids = new HashSet<Xid>();
+ private Set<Xid> knownXids = new HashSet<Xid>();
+ private Set<Xid> finishedXids = new HashSet<Xid>();//end was called with TMSUCCESS or TMFAIL
+ private int errorStatus;
public MockResource(MockResourceManager manager, String xaResourceName) {
this.manager = manager;
this.xaResourceName = xaResourceName;
}
+ public MockResource(String xaResourceName, int errorStatus) {
+ this.manager = new MockResourceManager();
+ this.xaResourceName = xaResourceName;
+ this.errorStatus = errorStatus;
+ }
+
public int getTransactionTimeout() throws XAException {
return timeout;
}
@@ -110,6 +117,9 @@
if (!finishedXids.contains(xid)) {
throw new XAException(XAException.XAER_PROTO);
}
+ if (errorStatus != 0) {
+ throw new XAException(errorStatus);
+ }
preparedXids.remove(xid);
committed = true;
}
@@ -131,11 +141,11 @@
}
public void forget(Xid xid) throws XAException {
- throw new UnsupportedOperationException();
+// throw new UnsupportedOperationException();
}
public Xid[] recover(int flag) throws XAException {
- return (Xid[]) preparedXids.toArray(new Xid[preparedXids.size()]);
+ return preparedXids.toArray(new Xid[preparedXids.size()]);
}
public boolean isPrepared() {
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResourceManager.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResourceManager.java
index 82a5050..78a96eb 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResourceManager.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResourceManager.java
@@ -22,7 +22,6 @@
import java.util.Map;
import java.util.Set;
-import javax.transaction.SystemException;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
@@ -33,20 +32,17 @@
* @version $Rev$ $Date$
*/
public class MockResourceManager {
- private boolean willCommit;
- private Map xids = new HashMap();
+ private Map<Xid, Set<XAResource>> xids = new HashMap<Xid, Set<XAResource>>();
- public MockResourceManager(boolean willCommit) {
- this.willCommit = willCommit;
+ public MockResourceManager() {
}
public MockResource getResource(String xaResourceName) {
- MockResource mockResource = new MockResource(this, xaResourceName);
- return mockResource;
+ return new MockResource(this, xaResourceName);
}
public void join(Xid xid, XAResource xaRes) throws XAException {
- Set resSet = (Set) xids.get(xid);
+ Set<XAResource> resSet = xids.get(xid);
if (resSet == null) {
throw new XAException(XAException.XAER_NOTA);
}
@@ -57,7 +53,7 @@
if (xids.containsKey(xid)) {
throw new XAException(XAException.XAER_DUPID);
}
- Set resSet = new HashSet();
+ Set<XAResource> resSet = new HashSet<XAResource>();
resSet.add(xaRes);
xids.put(xid, resSet);
}
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/ProtocolTest.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/ProtocolTest.java
index 122b4a3..7624ca7 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/ProtocolTest.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/ProtocolTest.java
@@ -32,8 +32,8 @@
protected void setUp() throws Exception {
tm = new TransactionManagerImpl();
- mrm1 = new MockResourceManager(true);
- mrm2 = new MockResourceManager(true);
+ mrm1 = new MockResourceManager();
+ mrm2 = new MockResourceManager();
mr11 = new MockResource(mrm1, "mr11");
mr12 = new MockResource(mrm1, "mr12");
mr21 = new MockResource(mrm2, "mr21");
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerImplTest.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerImplTest.java
index f79f4e9..372a29f 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerImplTest.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerImplTest.java
@@ -33,10 +33,10 @@
*/
public class TransactionManagerImplTest extends TestCase {
- MockResourceManager rm1 = new MockResourceManager(true);
+ MockResourceManager rm1 = new MockResourceManager();
MockResource r1_1 = rm1.getResource("rm1_1");
MockResource r1_2 = rm1.getResource("rm1_2");
- MockResourceManager rm2 = new MockResourceManager(true);
+ MockResourceManager rm2 = new MockResourceManager();
MockResource r2_1 = rm2.getResource("rm2_1");
MockResource r2_2 = rm2.getResource("rm2_2");
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TestTransactionManager.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerTest.java
similarity index 94%
rename from geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TestTransactionManager.java
rename to geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerTest.java
index 558b183..ae6b03c 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TestTransactionManager.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerTest.java
@@ -29,7 +29,7 @@
*
* @version $Rev$ $Date$
*/
-public class TestTransactionManager extends TestCase {
+public class TransactionManagerTest extends TestCase {
TransactionManager tm;
MockResourceManager rm1, rm2, rm3;
@@ -113,8 +113,8 @@
protected void setUp() throws Exception {
tm = new TransactionManagerImpl();
- rm1 = new MockResourceManager(true);
- rm2 = new MockResourceManager(true);
- rm3 = new MockResourceManager(false);
+ rm1 = new MockResourceManager();
+ rm2 = new MockResourceManager();
+ rm3 = new MockResourceManager();
}
}
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/XidImporterTest.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/XidImporterTest.java
index 8f447bb..72c51c0 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/XidImporterTest.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/XidImporterTest.java
@@ -33,10 +33,10 @@
* */
public class XidImporterTest extends TestCase{
- MockResourceManager rm1 = new MockResourceManager(true);
+ MockResourceManager rm1 = new MockResourceManager();
MockResource r1_1 = new MockResource(rm1, "rm1");
MockResource r1_2 = new MockResource(rm1, "rm1");
- MockResourceManager rm2 = new MockResourceManager(true);
+ MockResourceManager rm2 = new MockResourceManager();
MockResource r2_1 = new MockResource(rm2, "rm2");
MockResource r2_2 = new MockResource(rm2, "rm2");
diff --git a/geronimo-transaction/src/test/resources/META-INF/NOTICE.txt b/geronimo-transaction/src/test/resources/META-INF/NOTICE.txt
index bb6397e..1bff2e3 100644
--- a/geronimo-transaction/src/test/resources/META-INF/NOTICE.txt
+++ b/geronimo-transaction/src/test/resources/META-INF/NOTICE.txt
@@ -1,5 +1,5 @@
Apache Geronimo
-Copyright 2003-2009 The Apache Software Foundation
+Copyright 2003-2010 The Apache Software Foundation
This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).