blob: 07ce921ebeab39df25858a592868c9be19fde43c [file] [log] [blame]
/*
* 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.tuscany.sca.policy.transaction.runtime.geronimo;
import java.util.logging.Logger;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import junit.framework.TestCase;
import org.apache.geronimo.transaction.manager.NamedXAResource;
import org.apache.tuscany.sca.policy.transaction.runtime.TransactionManagerHelper;
import org.apache.tuscany.sca.policy.transaction.runtime.geronimo.TransactionManagerWrapper;
/**
* @version $Rev$ $Date$
*/
public class TransactionManagerHelperTestCaseOFF extends TestCase {
private static final Logger logger = Logger.getLogger(TransactionManagerHelperTestCaseOFF.class.getName());
public static class MockXAResource implements NamedXAResource {
private String rm;
private String id;
private int timeout = 1000;
public MockXAResource(String rm, String id) {
super();
this.rm = rm;
this.id = id;
}
public String getName() {
return rm + ":" + id;
}
public void commit(Xid xid, boolean onePhase) throws XAException {
logger.info(id + ": commit(" + xid + "," + onePhase + ")");
}
public void end(Xid xid, int flags) throws XAException {
logger.info(id + ": end(" + xid + "," + toString(flags) + ")");
}
public void forget(Xid xid) throws XAException {
logger.info(id + ": forget(" + xid + ")");
}
public int getTransactionTimeout() throws XAException {
return timeout;
}
public boolean isSameRM(XAResource xares) throws XAException {
if (xares instanceof MockXAResource) {
MockXAResource res = (MockXAResource)xares;
return res.rm.endsWith(rm);
} else {
return false;
}
}
public int prepare(Xid xid) throws XAException {
logger.info(id + ": prepare(" + xid + ")");
return XA_OK;
}
public Xid[] recover(int flag) throws XAException {
return null;
}
public void rollback(Xid xid) throws XAException {
logger.info(id + ": rollback(" + xid + ")");
}
public boolean setTransactionTimeout(int seconds) throws XAException {
this.timeout = seconds;
return true;
}
public void start(Xid xid, int flags) throws XAException {
logger.info(id + ": start(" + xid + "," + toString(flags) + ")");
}
private String toString(int flags) {
StringBuffer sb = new StringBuffer();
if ((flags & TMENDRSCAN) != 0) {
sb.append("TMENDRSCAN ");
}
if ((flags & TMFAIL) != 0) {
sb.append("TMFAIL ");
}
if ((flags & TMJOIN) != 0) {
sb.append("TMJOIN ");
}
if ((flags & TMONEPHASE) != 0) {
sb.append("TMONEPHASE ");
}
if ((flags & TMRESUME) != 0) {
sb.append("TMRESUME ");
}
if ((flags & TMSTARTRSCAN) != 0) {
sb.append("TMSTARTRSCAN ");
}
if ((flags & TMSUCCESS) != 0) {
sb.append("TMSUCCESS ");
}
if ((flags & TMSUSPEND) != 0) {
sb.append("TMSUSPEND ");
}
if (sb.length() == 0) {
sb.append("TMNOFLAGS");
} else {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
}
public void testHelper() throws Exception {
TransactionManagerWrapper activator = new TransactionManagerWrapper();
activator.start();
TransactionManager tm = activator.getTransactionManager();
// GeronimoUserTransaction tx = new GeronimoUserTransaction(tm);
TransactionManagerHelper helper = new TransactionManagerHelper(tm);
// No TX yet
assertNull(tm.getTransaction());
Transaction t1 = helper.managedGlobalTransactionPreInvoke();
// Should create T1
assertNotNull(t1);
// The current TX should be T1
assertSame(t1, tm.getTransaction());
XAResource res1 = new MockXAResource("Derby", "001");
XAResource res2 = new MockXAResource("DB2", "002");
tm.getTransaction().enlistResource(res1);
tm.getTransaction().enlistResource(res2);
Transaction suspended = helper.suspendsTransactionPreInvoke();
suspended.delistResource(res1, XAResource.TMSUSPEND);
suspended.delistResource(res2, XAResource.TMSUSPEND);
// T1 is suspended
assertSame(t1, suspended);
// No more active TX
assertNull(tm.getTransaction());
Transaction t2 = helper.managedGlobalTransactionPreInvoke();
assertNotNull(t2);
// The current TX should be T2
assertSame(t2, tm.getTransaction());
XAResource res3 = new MockXAResource("Oracle", "003");
tm.getTransaction().enlistResource(res3);
tm.getTransaction().delistResource(res3, XAResource.TMSUCCESS);
tm.rollback();
// Skip post
// helper.managedGlobalTransactionPostInvoke(t2);
helper.suspendsTransactionPostInvoke(suspended);
suspended.enlistResource(res1);
suspended.enlistResource(res2);
// T1 is now resumed
assertSame(t1, tm.getTransaction());
helper.managedGlobalTransactionPostInvoke(t1, false);
assertNotNull(tm.getTransaction());
assertEquals(6, t1.getStatus());
activator.stop();
}
}