/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.cts.interfaces;
import javax.ejb.*;
import javax.transaction.Status;
import javax.transaction.UserTransaction;
import javax.transaction.RollbackException;
import org.jboss.test.cts.keys.AccountPK;
/**
* A utility class for testing UserTransaction in a stand-alone
* client, or a BMT enterprise bean.
* This is not part of any interface, just shared code used in
* client and server.
* This does not depend on JUnit, as JUnit is not available on the server.
*
* @author <a href="mailto:osh@sparre.dk">Ole Husgaard</a>
* @version $Revision: 81036 $
*/
public class UserTransactionTester
{
static org.jboss.logging.Logger log =
org.jboss.logging.Logger.getLogger(UserTransactionTester.class);
/**
* Home of entity used as a resource for testing.
*/
private CtsBmpHome home;
/**
* UserTransaction to test.
*/
private UserTransaction ut;
/**
* First resource for testing.
*/
private CtsBmp bean1;
/**
* Second resource for testing.
*/
private CtsBmp bean2;
/**
* Create a new UserTransaction test instance.
*/
public UserTransactionTester(CtsBmpHome home,
UserTransaction userTransaction)
{
this.home = home;
this.ut = userTransaction;
}
/**
* Run all the UserTransaction tests.
*/
public boolean runAllTests()
{
// No resource tests
if (!testBeginRollback())
return false;
if (!testBeginCommit())
return false;
if (!testBeginSetrollbackonlyRollback())
return false;
if (!testBeginSetrollbackonlyCommit())
return false;
// Create first instance
try {
bean1 = home.create(new AccountPK("UT_TestBean1"), "Ole1");
} catch (Exception ex) {
log.debug("failed", ex);
return false;
}
// Single resource tests
if (!testSingleRollback())
return false;
if (!testSingleCommit())
return false;
if (!testSingleSetrollbackonlyCommit())
return false;
// Can second instance be created in a tx that is rolled back?
try {
ut.begin();
bean2 = home.create(new AccountPK("UT_TestBean2"), "Ole2");
ut.rollback();
// Should no longer exist
boolean gotException = false;
try {
bean2.setPersonsName("Ole");
} catch (Exception e) {
log.info("IGNORE PREVIOUS NoSuchEntityException - it is intentional");
gotException = true;
}
if (!gotException)
throw new RuntimeException("Rollback didn't rollback create.");
} catch (Exception ex) {
log.debug("failed", ex);
return false;
}
// Create second instance
try {
bean2 = home.create(new AccountPK("UT_TestBean2"), "Ole2");
} catch (Exception ex) {
log.debug("failed", ex);
return false;
}
return true;
}
//
// No resource tests.
//
/**
* Simple begin/rollback test.
*/
private boolean testBeginRollback()
{
try {
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
ut.begin();
if (ut.getStatus() != Status.STATUS_ACTIVE)
throw new RuntimeException("New tx not active.");
ut.rollback();
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
} catch (Exception ex) {
log.debug("failed", ex);
return false;
}
return true;
}
/**
* Simple begin/commit test.
*/
private boolean testBeginCommit()
{
try {
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
ut.begin();
if (ut.getStatus() != Status.STATUS_ACTIVE)
throw new RuntimeException("New tx not active.");
ut.commit();
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
} catch (Exception ex) {
log.debug("failed", ex);
return false;
}
return true;
}
/**
* Simple begin/setRollbackOnly/rollback test.
*/
private boolean testBeginSetrollbackonlyRollback()
{
try {
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
ut.begin();
if (ut.getStatus() != Status.STATUS_ACTIVE)
throw new RuntimeException("New tx not active.");
ut.setRollbackOnly();
if (ut.getStatus() != Status.STATUS_MARKED_ROLLBACK)
throw new RuntimeException("Tx not marked for rollback.");
ut.rollback();
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
} catch (Exception ex) {
log.debug("failed", ex);
return false;
}
return true;
}
/**
* Simple begin/setRollbackOnly/commit test.
*/
private boolean testBeginSetrollbackonlyCommit()
{
try {
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
ut.begin();
if (ut.getStatus() != Status.STATUS_ACTIVE)
throw new RuntimeException("New tx not active.");
ut.setRollbackOnly();
if (ut.getStatus() != Status.STATUS_MARKED_ROLLBACK)
throw new RuntimeException("Tx not marked for rollback.");
boolean gotException = false;
try {
ut.commit();
} catch (RollbackException rbe) {
gotException = true;
}
if (!gotException)
throw new RuntimeException("Didn't get expected RollbackException.");
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
} catch (Exception ex) {
log.debug("failed", ex);
return false;
}
return true;
}
//
// Single resource tests.
//
/**
* Tests if a rollback really rolls back.
*/
private boolean testSingleRollback()
{
try {
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
bean1.setPersonsName("Ole");
if (!bean1.getPersonsName().equals("Ole"))
throw new RuntimeException("Unable to set property.");
ut.begin();
if (ut.getStatus() != Status.STATUS_ACTIVE)
throw new RuntimeException("New tx not active.");
if (!bean1.getPersonsName().equals("Ole"))
throw new RuntimeException("Property changes after begin.");
bean1.setPersonsName("Peter");
if (!bean1.getPersonsName().equals("Peter"))
throw new RuntimeException("Unable to set property.");
ut.rollback();
if (!bean1.getPersonsName().equals("Ole"))
throw new RuntimeException("Rollback doesn't work.");
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
} catch (Exception ex) {
log.debug("failed", ex);
return false;
}
return true;
}
/**
* Tests if a commit really commits.
*/
private boolean testSingleCommit()
{
try {
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
bean1.setPersonsName("Ole");
if (!bean1.getPersonsName().equals("Ole"))
throw new RuntimeException("Unable to set property.");
ut.begin();
if (ut.getStatus() != Status.STATUS_ACTIVE)
throw new RuntimeException("New tx not active.");
if (!bean1.getPersonsName().equals("Ole"))
throw new RuntimeException("Property changes after begin.");
bean1.setPersonsName("Peter");
if (!bean1.getPersonsName().equals("Peter"))
throw new RuntimeException("Unable to set property.");
ut.commit();
if (!bean1.getPersonsName().equals("Peter"))
throw new RuntimeException("Property not set after commit.");
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
} catch (Exception ex) {
log.debug("failed", ex);
return false;
}
return true;
}
/**
* Tests if a setRollbackOnly really makes the transaction rollback.
*/
private boolean testSingleSetrollbackonlyCommit()
{
try {
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
bean1.setPersonsName("Ole");
if (!bean1.getPersonsName().equals("Ole"))
throw new RuntimeException("Unable to set property.");
ut.begin();
if (ut.getStatus() != Status.STATUS_ACTIVE)
throw new RuntimeException("New tx not active.");
if (!bean1.getPersonsName().equals("Ole"))
throw new RuntimeException("Property changes after begin.");
bean1.setPersonsName("Peter");
if (!bean1.getPersonsName().equals("Peter"))
throw new RuntimeException("Unable to set property.");
ut.setRollbackOnly();
if (ut.getStatus() != Status.STATUS_MARKED_ROLLBACK)
throw new RuntimeException("Tx not marked for rollback.");
boolean gotException = false;
try {
ut.commit();
} catch (RollbackException rbe) {
gotException = true;
}
if (!gotException)
throw new RuntimeException("Didn't get expected RollbackException.");
if (!bean1.getPersonsName().equals("Ole"))
throw new RuntimeException("Didn't roll back.");
if (ut.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("No tx should be active.");
} catch (Exception ex) {
log.debug("failed", ex);
return false;
}
return true;
}
}