/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * Licensed 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.seasar.extension.tx; import java.rmi.AccessException; import java.rmi.RemoteException; import javax.transaction.SystemException; import org.aopalliance.intercept.MethodInvocation; import org.seasar.extension.unit.S2TestCase; /** * @author koichik */ public class AbstTxInterceptorTest extends S2TestCase { private static final String PATH = "AbstTxInterceptorTest.dicon"; private ExceptionBean exBean; private TestAdapter adapter; private TestInterceptor testTx; protected void setUp() throws Exception { include(PATH); } /** * @throws Exception */ public void testType() throws Exception { try { testTx.addCommitRule(Throwable.class); testTx.addCommitRule(Error.class); testTx.addCommitRule(Exception.class); testTx.addCommitRule(RuntimeException.class); testTx.addCommitRule(Object.class); fail("1"); } catch (IllegalArgumentException expected) { System.out.println(expected); } try { testTx.addRollbackRule(Throwable.class); testTx.addRollbackRule(Error.class); testTx.addRollbackRule(Exception.class); testTx.addRollbackRule(RuntimeException.class); testTx.addRollbackRule(String.class); fail("2"); } catch (IllegalArgumentException expected) { System.out.println(expected); } } /** * @throws Exception */ public void testNoRule() throws Exception { try { exBean.invoke(); fail("1"); } catch (Exception expected) { System.out.println(expected); } assertTrue(adapter.rollbackOnly); } /** * @throws Exception */ public void testCommitRule() throws Exception { testTx.addRollbackRule(RuntimeException.class); testTx.addRollbackRule(RemoteException.class); testTx.addCommitRule(Exception.class); try { exBean.invoke(new SystemException()); fail("1"); } catch (Throwable expected) { System.out.println(expected); } assertFalse(adapter.rollbackOnly); } /** * @throws Exception */ public void testRollbackRule1() throws Exception { testTx.addRollbackRule(RuntimeException.class); testTx.addRollbackRule(RemoteException.class); testTx.addCommitRule(Exception.class); try { exBean.invoke(new UnsupportedOperationException()); fail("1"); } catch (Throwable expected) { System.out.println(expected); } assertTrue(adapter.rollbackOnly); } /** * @throws Exception */ public void testRollbackRule2() throws Exception { testTx.addRollbackRule(RuntimeException.class); testTx.addRollbackRule(RemoteException.class); testTx.addCommitRule(Exception.class); try { exBean.invoke(new AccessException("")); fail("1"); } catch (Throwable expected) { System.out.println(expected); } assertTrue(adapter.rollbackOnly); } /** * @throws Exception */ public void testRollbackRule3() throws Exception { testTx.addRollbackRule(RuntimeException.class); testTx.addRollbackRule(RemoteException.class); testTx.addCommitRule(Exception.class); try { exBean.invoke(new Throwable()); fail("1"); } catch (Throwable expected) { System.out.println(expected); } assertTrue(adapter.rollbackOnly); } /** * @throws Exception */ public void testRollbackRule4() throws Exception { testTx.addRollbackRule(RuntimeException.class); testTx.addRollbackRule(RemoteException.class); testTx.addCommitRule(Exception.class); try { exBean.invoke(new OutOfMemoryError()); fail("1"); } catch (Throwable expected) { System.out.println(expected); } assertTrue(adapter.rollbackOnly); } /** * */ public static class TestInterceptor extends AbstractTxInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { return transactionManagerAdapter .required(new DefaultTransactionCallback(invocation, txRules)); } } /** * */ public static class TestAdapter implements TransactionManagerAdapter { private boolean rollbackOnly; public void setRollbackOnly() { rollbackOnly = true; } public Object mandatory(TransactionCallback callback) throws Throwable { return callback.execute(this); } public Object never(TransactionCallback callback) throws Throwable { return callback.execute(this); } public Object notSupported(TransactionCallback callback) throws Throwable { return callback.execute(this); } public Object required(TransactionCallback callback) throws Throwable { return callback.execute(this); } public Object requiresNew(TransactionCallback callback) throws Throwable { return callback.execute(this); } } }