    1   /***
    2    * @(#)BasicTransactionTest.java
    3    *
    4    * JFoxSOAF, Service-Oriented Application Framework
    5    *
    6    * Copyright(c) JFoxSOAF Team
    7    *
    8    * Licensed under the GNU LGPL, Version 2.1 (the "License");
    9    * you may not use this file except in compliance with the License.
    10   * You may obtain a copy of the License at
    11   *
    12   * http://www.gnu.org/copyleft/lesser.html
    13   *
    14   * Unless required by applicable law or agreed to in writing, software
    15   * distributed under the License is distributed on an "AS IS" BASIS,
    16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    17   * See the License for the specific language governing permissions and
    18   * limitations under the License.
    19   *
    20   * For more information, please visit:
    21   * http://www.jfox.cn/confluence/display/JFoxSOAF/Home
    22   * http://www.huihoo.org/jfox/jfoxsoaf
    23   */
    24
    25  package org.huihoo.jfox.soaf.services.transaction;
    26
    27  import java.lang.reflect.Field;
    28
    29  import javax.transaction.RollbackException;
    30  import javax.transaction.Status;
    31  import javax.transaction.UserTransaction;
    32
    33  import junit.framework.TestCase;
    34
    35  import org.apache.commons.logging.Log;
    36  import org.apache.commons.logging.LogFactory;
    37  import org.huihoo.jfox.soaf.container.ServiceFactory;
    38  import org.huihoo.jfox.soaf.container.ServiceLoader;
    39
    40  /***
    41   * JUnit test case for the TransactionService
    42   *
    43   * @author <a href="mailto:founder_chen@yahoo.com">Peter Cheng </a>
    44   * @version $Revision:$ $Date:$
    45   * @version Revision: 1.0
    46   */
    47
    48  public class BasicTransactionTest extends TestCase {
    49
    50  	private static final Log log = LogFactory
    51  			.getLog(BasicTransactionTest.class);
    52
    53  	private ServiceLoader sl = ServiceLoader.getInstance();
    54
    55  	private ServiceFactory sf = ServiceFactory.getInstance();
    56
    57  	private JotmTransactionService jts;
    58
    59  	/***
    60  	 * Constructor for BasicTransactionTest.
    61  	 *
    62  	 * @param arg0
    63  	 */
    64  	public BasicTransactionTest(String arg0) {
    65  		super(arg0);
    66  	}
    67
    68  	/*
    69  	 * @see TestCase#setUp()
    70  	 */
    71  	protected void setUp() throws Exception {
    72  		super.setUp();
    73  		if (!sl.isServiceLoaded()) {
    74  			sl.initService("jfoxsoaf-config.xml");
    75  		}
    76
    77  		jts = (JotmTransactionService) sf
    78  				.getService(JotmTransactionService.class);
    79  	}
    80
    81  	/*
    82  	 * @see TestCase#tearDown()
    83  	 */
    84  	protected void tearDown() throws Exception {
    85  		super.tearDown();
    86  	}
    87
    88  	public void testSimpleTrans() {
    89  		UserTransaction utc = jts.getUserTransaction();
    90  		try {
    91  			log.info("a simple transaction which is committed:");
    92  			log.info("\t- initial status : " + getStatusName(utc.getStatus()));
    93  			utc.begin();
    94  			log.info("\t- after begin status : "
    95  					+ getStatusName(utc.getStatus()));
    96  			utc.commit();
    97  			log.info("\t- after commit status : "
    98  					+ getStatusName(utc.getStatus()));
    99  		} catch (Exception e) {
    100 			log.info("Exception of type :" + e.getClass().getName()
    101 					+ " has been thrown");
    102 			log.info("Exception message :" + e.getMessage());
    103 			e.printStackTrace();
    104 		}
    105 	}
    106
    107 	public void testRollback() {
    108 		UserTransaction utc = jts.getUserTransaction();
    109 		try {
    110 			log.info("a simple transaction which is rolled back.");
    111 			log.info("we set a transaction timeout to 1 second, begin the transaction, "
    112 							+ "and wait 5 seconds before committing it:");
    113 			utc.setTransactionTimeout(1);
    114 			log.info("\t- initial status : " + getStatusName(utc.getStatus()));
    115 			utc.begin();
    116 			log.info("\t- after begin status : "
    117 					+ getStatusName(utc.getStatus()));
    118 			log.info("\t- wait for 5 seconds");
    119 			Thread.sleep(5 * 1000);
    120 			utc.commit();
    121 			log.info("ERROR: the commit method should have failed due to timeout expiration");
    122 		} catch (RollbackException e) {
    123 			try {
    124 				log.info("\t- after rollback status : "
    125 						+ getStatusName(utc.getStatus()));
    126 			} catch (Exception ex) {
    127 				log.info("Exception of type :" + e.getClass().getName()
    128 						+ " has been thrown");
    129 				log.info("Exception message :" + e.getMessage());
    130 				e.printStackTrace();
    131 			}
    132 		} catch (Exception e) {
    133 			log.info("Exception of type :" + e.getClass().getName()
    134 					+ " has been thrown");
    135 			log.info("Exception message :" + e.getMessage());
    136 			e.printStackTrace();
    137 		}
    138
    139 	}
    140
    141 	public static String getStatusName(int status) {
    142 		String statusName = null;
    143 		try {
    144 			Field[] flds = Status.class.getDeclaredFields();
    145 			for (int i = 0; i < flds.length; i++) {
    146 				if (flds[i].getInt(null) == status)
    147 					statusName = flds[i].getName();
    148 			}
    149 		} catch (Exception e) {
    150 			statusName = "invalid status value!";
    151 		}
    152 		return statusName;
    153 	}
    154
    155 }