/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. * See the copyright.txt in the distribution for a * full listing of individual contributors. * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * 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, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * (C) 2005-2006, * @author JBoss Inc. */ package com.jboss.transaction.txinterop.interop; import javax.inject.Named; import com.arjuna.webservices11.wsat.AtomicTransactionConstants; import com.arjuna.webservices11.wscoor.CoordinationConstants; import com.arjuna.webservices11.ServiceRegistry; import org.oasis_open.docs.ws_tx.wscoor._2006._06.CoordinationContextType; import com.arjuna.wst.CompletionCoordinatorParticipant; import com.arjuna.wst.TransactionRolledBackException; import com.jboss.transaction.txinterop.interop.states.ATInteropPreparedAfterTimeoutState; import com.jboss.transaction.txinterop.interop.states.ATInteropRetryPreparedAbortState; import com.jboss.transaction.txinterop.interop.states.ATInteropRetryPreparedCommitState; import com.jboss.transaction.txinterop.interop.states.InteropWaitState; import com.jboss.transaction.txinterop.proxy.ProxyConversation; import com.jboss.transaction.txinterop.proxy.ProxyURIRewriting; import com.jboss.transaction.txinterop.webservices.atinterop.*; /** * The AT endpoint test case * @author kevin */ public class ATTestCase extends InteropTestCase { /** * The coordinator URI of the source. */ private static final String SOURCE_COORDINATOR_URI ; /** * The service URI of the participant. */ private static final String SOURCE_PARTICIPANT_URI ; /** * Construct the named test case. */ public ATTestCase() { // Default the service to the local service. setParticipantURI(getSourceParticipantURI()) ; setTestTimeout(120000) ; setAsyncTest(true) ; } /** * testAT1_1 - 1.1 CompletionCommit * Participant creates and commits a transaction using the initiator's coordinator. * @throws Exception on failure. */ public void testAT1_1() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_COMMITTED) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final String coordinatorURI = ProxyURIRewriting.rewriteURI(ProxyConversation.getAlternateConversationId(conversationId), getSourceCoordinatorURI()) ; getParticipantStub().completionCommit(serviceURI, coordinatorURI) ; state.waitForCompletion(getTestTimeout()) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT1_2 - 1.2 CompletionRollback * Participant creates and rolls back a transaction using the initiator's coordinator. * @throws Exception on failure. */ public void testAT1_2() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_ABORTED) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final String coordinatorURI = ProxyURIRewriting.rewriteURI(ProxyConversation.getAlternateConversationId(conversationId), getSourceCoordinatorURI()) ; getParticipantStub().completionRollback(serviceURI, coordinatorURI) ; state.waitForCompletion(getTestTimeout()) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT2_1 - 2.1 Commit * Participant registers for Durable2PC, initiator commits, transaction commits successfully. * @throws Exception on failure. */ public void testAT2_1() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_COMMITTED) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().commit(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT2_2 - 2.2 Rollback * Participant registers for Durable2PC, initiator rolls back. * @throws Exception on failure. */ public void testAT2_2() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_ABORTED) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().rollback(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.rollback() ; state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT3_1 - 3.1 Phase2Rollback * Coordinator aborts the transaction due to an Aborted vote during the prepare phase. * @throws Exception on failure. */ public void testAT3_1() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_ABORTED, 2) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().phase2Rollback(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; fail("Transaction rollback expected") ; } catch (final TransactionRolledBackException trbe) { state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT3_2 - 3.2 Readonly * Tests coordinator committing a transaction with a read only participant. * @throws Exception on failure. */ public void testAT3_2() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_COMMITTED) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().readonly(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT3_3 - 3.3 VolatileAndDurable * Tests registration during the volatile prepare phase. * @throws Exception on failure. */ public void testAT3_3() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_COMMITTED) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().volatileAndDurable(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT4_1 - 4.1 EarlyReadonly * Tests the case of a participant initiated ReadOnly message occurring prior to the prepare phase. * @throws Exception on failure. */ public void testAT4_1() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_COMMITTED) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().earlyReadonly(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT4_2 - 4.2 EarlyAborted * Tests the case of a participant initiated Aborted message occurring prior to the prepare phase. * @throws Exception on failure. */ public void testAT4_2() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_ABORTED, 2) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().earlyAborted(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; fail("Transaction rollback expected") ; } catch (final TransactionRolledBackException trbe) { state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT5_1 - 5.1 ReplayCommit * Participant registers for Durable2PC, initator initiates commit, participant fails after prepared, recovers and resends prepared. Transaction commits normally. * @throws Exception on failure. */ public void testAT5_1() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_COMMITTED) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().replayCommit(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT5_2 - 5.2 RetryPreparedCommit * Tests recovery from a communication failure during the prepare phase. Transaction commits normally. * @throws Exception on failure. */ public void testAT5_2() throws Exception { final String conversationId = getConversationId() ; final ATInteropRetryPreparedCommitState state = new ATInteropRetryPreparedCommitState() ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().retryPreparedCommit(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT5_3 - 5.3 RetryPreparedAbort * Tests recovery from a communication failure during the prepare phase. Transaction times out. * @throws Exception on failure. */ public void testAT5_3() throws Exception { final String conversationId = getConversationId() ; final ATInteropRetryPreparedAbortState state = new ATInteropRetryPreparedAbortState() ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().retryPreparedAbort(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; fail("Transaction rollback expected") ; } catch (final TransactionRolledBackException trbe) { state.waitForCompletion(getTestTimeout()) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT5_4 - 5.4 RetryCommit * Tests recovery from a communication failure during the commit phase. Transaction commits normally. * @throws Exception on failure. */ public void testAT5_4() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_COMMITTED) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().retryCommit(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT5_5 - 5.5 PreparedAfterTimeout * Tests recovery from a communication failure during the prepare phase. Transaction times out. Two participants, volatile and durable. * @throws Exception on failure. */ public void testAT5_5() throws Exception { final String conversationId = getConversationId() ; final ATInteropPreparedAfterTimeoutState state = new ATInteropPreparedAfterTimeoutState() ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().preparedAfterTimeout(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; fail("Transaction rollback expected") ; } catch (final TransactionRolledBackException tre) { state.waitForCompletion(getTestTimeout()) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * testAT5_6 - 5.6 LostCommitted * Tests the effect of a lost Committed message. * @throws Exception on failure. */ public void testAT5_6() throws Exception { final String conversationId = getConversationId() ; final InteropWaitState state = new InteropWaitState(AtomicTransactionConstants.WSAT_ACTION_COMMITTED) ; ProxyConversation.setConversationState(conversationId, state) ; try { final String serviceURI = ProxyURIRewriting.rewriteURI(conversationId, getParticipantURI()) ; final CoordinationContextType context = ATInteropUtil.createCoordinationContext(getSourceCoordinatorURI()) ; getParticipantStub().lostCommitted(serviceURI, context) ; final CompletionCoordinatorParticipant participant = ATInteropUtil.registerCompletion(context, context.getIdentifier().getValue()) ; participant.commit() ; state.waitForCompletion(0) ; } finally { ProxyConversation.clearConversationState(conversationId) ; } assertTrue("Conversation did not complete successfully", state.isSuccessful()) ; } /** * Get the source coordinator URI. * @return The source coordinator uri. */ protected static String getSourceCoordinatorURI() { return SOURCE_COORDINATOR_URI ; } /** * Get the source participant URI. * @return The source participant uri. */ protected static String getSourceParticipantURI() { return SOURCE_PARTICIPANT_URI ; } /** * Get the participant stub for the test. * @return The participant stub. */ private ParticipantStub getParticipantStub() { return (getAsyncTest() ? AsyncParticipantStub.getParticipantStub() : SyncParticipantStub.getParticipantStub()) ; } static { final ServiceRegistry serviceRegistry = ServiceRegistry.getRegistry() ; SOURCE_PARTICIPANT_URI = serviceRegistry.getServiceURI(ATInteropConstants.SERVICE_PARTICIPANT) ; SOURCE_COORDINATOR_URI = serviceRegistry.getServiceURI(CoordinationConstants.ACTIVATION_SERVICE_NAME) ; } }