You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by as...@apache.org on 2007/01/03 09:02:12 UTC

svn commit: r492073 - in /incubator/ode/trunk/bpel-runtime: pom.xml src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java

Author: assaf
Date: Wed Jan  3 00:02:12 2007
New Revision: 492073

URL: http://svn.apache.org/viewvc?view=rev&rev=492073
Log:
Modified ActivityRecoveryTest to use jMock.

Modified:
    incubator/ode/trunk/bpel-runtime/pom.xml
    incubator/ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java

Modified: incubator/ode/trunk/bpel-runtime/pom.xml
URL: http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-runtime/pom.xml?view=diff&rev=492073&r1=492072&r2=492073
==============================================================================
--- incubator/ode/trunk/bpel-runtime/pom.xml (original)
+++ incubator/ode/trunk/bpel-runtime/pom.xml Wed Jan  3 00:02:12 2007
@@ -74,6 +74,12 @@
             <type>tar</type>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>jmock</groupId>
+            <artifactId>jmock</artifactId>
+            <version>1.1.0</version>
+            <scope>test</scope>
+        </dependency>
 
         <dependency>
             <groupId>stax</groupId>

Modified: incubator/ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java
URL: http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java?view=diff&rev=492073&r1=492072&r2=492073
==============================================================================
--- incubator/ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java (original)
+++ incubator/ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java Wed Jan  3 00:02:12 2007
@@ -24,7 +24,10 @@
 
 import javax.xml.namespace.QName;
 
-import junit.framework.TestCase;
+import org.jmock.*;
+import org.jmock.core.*;
+import org.jmock.core.matcher.StatelessInvocationMatcher;
+import org.jmock.core.stub.CustomStub;
 
 import org.apache.ode.bpel.engine.BpelManagementFacadeImpl;
 import org.apache.ode.bpel.iapi.ContextException;
@@ -51,83 +54,127 @@
 /**
  * Test activity recovery and failure handling.
  */
-public class ActivityRecoveryTest extends TestCase {
+public class ActivityRecoveryTest extends MockObjectTestCase {
 
     static final String   NAMESPACE = "http://ode.apache.org/bpel/unit-test";
     static final String[] ACTIONS = new String[]{ "retry", "cancel", "fault" };
-    int                   _invoked;
-    int                   _failFor;
-    boolean               _responseSent;
     MockBpelServer        _server;
     BpelManagementFacade  _management;
     QName                 _processQName;
+    private Mock _testService;
 
-    public void testSuccessfulInvoke() throws Exception { 
-        execute("FailureToRecovery", 0);
-        assertCompleted(true, 1, null);
+
+    interface TestService {
+
+        public boolean invoke(); 
+
+        public void completed();
+
+    }
+
+
+    protected Stub[] failFirst(int times) {
+        Stub[] stubs = new Stub[times + 1];
+        for (int i = 0; i < times; ++i)
+            stubs[i] = returnValue(false);
+        stubs[times] = returnValue(true);
+        return stubs;
+    }
+
+    public void testInvokeSucceeds() throws Exception {
+        _testService.expects(once()).method("invoke").will(returnValue(true));
+        _testService.expects(once()).method("completed").after("invoke");
+
+        execute("FailureToRecovery");
+        assertTrue(lastInstance().getStatus() == TInstanceStatus.COMPLETED);
+        assertNoFailures();
     }
 
-    public void testInvokeAndRetry() throws Exception {
-        execute("FailureToRecovery", 2);
-        assertCompleted(true, 3, null);
+    public void testFailureWithRecoveryAfterRetry() throws Exception {
+        _testService.expects(exactly(3)).method("invoke").will(onConsecutiveCalls(failFirst(2)));
+        _testService.expects(once()).method("completed").after("invoke");
+
+        execute("FailureToRecovery");
+        assertTrue(lastInstance().getStatus() == TInstanceStatus.COMPLETED);
+        assertNoFailures();
     }
 
-    public void testRetryRecoveryAction() throws Exception {
-        execute("FailureToRecovery", 4);
-        assertRecovery(3, ACTIONS);
+    public void testFailureWithManualRecovery() throws Exception {
+        _testService.expects(exactly(5)).method("invoke").will(onConsecutiveCalls(failFirst(4)));
+        _testService.expects(once()).method("completed").after("invoke");
+
+        execute("FailureToRecovery");
         recover("retry");
-        assertRecovery(4, ACTIONS);
         recover("retry");
-        assertCompleted(true, 5, null);
+        assertTrue(lastInstance().getStatus() == TInstanceStatus.COMPLETED);
+        assertNoFailures();
     }
 
-    public void testFaultRecoveryAction() throws Exception {
-        execute("FailureToRecovery", 4);
-        assertRecovery(3, ACTIONS);
+    public void testFailureWithFaultAction() throws Exception {
+        _testService.expects(exactly(4)).method("invoke").will(onConsecutiveCalls(failFirst(4)));
+        _testService.expects(never()).method("completed").after("invoke");
+
+        execute("FailureToRecovery");
         recover("retry");
-        assertRecovery(4, ACTIONS);
         recover("fault");
-        assertCompleted(false, 4, OFailureHandling.FAILURE_FAULT_NAME);
+        assertTrue(lastInstance().getStatus() == TInstanceStatus.FAILED);
+        assertTrue(OFailureHandling.FAILURE_FAULT_NAME.equals(lastInstance().getFaultInfo().getName()));
+        assertNoFailures();
     }
 
-    public void testCancelRecoveryAction() throws Exception {
-        execute("FailureToCancel", 4);
-        assertRecovery(3, ACTIONS);
+    public void testFailureWithCancelAction() throws Exception {
+        _testService.expects(exactly(4)).method("invoke").will(onConsecutiveCalls(failFirst(4)));
+        _testService.expects(once()).method("completed").after("invoke");
+
+        execute("FailureToCancel");
         recover("retry");
-        assertRecovery(4, ACTIONS);
         recover("cancel");
-        assertCompleted(true, 4, null);
+        assertTrue(lastInstance().getStatus() == TInstanceStatus.COMPLETED);
+        assertNoFailures();
     }
 
     public void testImmediateFailure() throws Exception {
-        execute("FailureNoRetry", 1);
-        assertRecovery(1, ACTIONS);
-    }
+        _testService.expects(exactly(1)).method("invoke").will(returnValue(false));
+        _testService.expects(never()).method("completed").after("invoke");
 
-    public void testImmediateFault() throws Exception {
-        execute("FailureToFault", 2);
-        assertCompleted(false, 1, OFailureHandling.FAILURE_FAULT_NAME);
+        execute("FailureNoRetry");
+        assertRecovery(1, ACTIONS);
     }
 
-    public void testInheritence() throws Exception {
-        execute("FailureInheritence", 2);
-        assertCompleted(true, 3, null);
+    public void testImmediateFailureAndFault() throws Exception {
+        _testService.expects(exactly(1)).method("invoke").will(returnValue(false));
+        _testService.expects(never()).method("completed").after("invoke");
+
+        execute("FailureToFault");
+        assertTrue(lastInstance().getStatus() == TInstanceStatus.FAILED);
+        assertTrue(OFailureHandling.FAILURE_FAULT_NAME.equals(lastInstance().getFaultInfo().getName()));
+        assertNoFailures();
+    }
+
+    public void testFailureHandlingInheritence() throws Exception {
+        _testService.expects(exactly(3)).method("invoke").will(onConsecutiveCalls(failFirst(2)));
+        _testService.expects(once()).method("completed").after("invoke");
+
+        execute("FailureInheritence");
+        assertTrue(lastInstance().getStatus() == TInstanceStatus.COMPLETED);
+        assertNoFailures();
     }
 
     public void testInstanceSummary() throws Exception {
         _processQName = new QName(NAMESPACE, "FailureToRecovery");
-        _failFor = 3;
-        _invoked = 0;
+        _testService.expects(exactly(4)).method("invoke").will(onConsecutiveCalls(failFirst(3)));
+        _testService.expects(once()).method("completed").after("invoke");
         _server.invoke(_processQName, "instantiate", DOMUtils.newDocument().createElementNS(NAMESPACE, "tns:RequestElement"));
         _server.waitForBlocking();
         recover("retry"); // Completed.
-        _invoked = 0;
+        _testService.expects(exactly(3)).method("invoke").will(onConsecutiveCalls(failFirst(3)));
         _server.invoke(_processQName, "instantiate", DOMUtils.newDocument().createElementNS(NAMESPACE, "tns:RequestElement"));
         _server.waitForBlocking();
         recover("fault"); // Faulted.
-        _invoked = 0;
+        _testService.expects(exactly(3)).method("invoke").will(onConsecutiveCalls(failFirst(3)));
         _server.invoke(_processQName, "instantiate", DOMUtils.newDocument().createElementNS(NAMESPACE, "tns:RequestElement"));
         _server.waitForBlocking(); // Active, recovery.
+        // Stay active, awaiting recovery.
 
         TInstanceSummary summary = _management.getProcessInfo(_processQName).getProcessInfo().getInstanceSummary();
         for (TInstanceSummary.Instances instances : summary.getInstancesList()) {
@@ -150,35 +197,41 @@
         assertNotNull(summary.getFailures().getDtFailure());
     }
 
-/*
-    public void testOrderByStatus() throws Exception {
-    }
-*/
 
     protected void setUp() throws Exception {
+        // Override testService in test case.
+        _testService = mock(TestService.class);
+        // We use one partner to simulate failing service and receive message upon process completion.
+        final Mock partner = mock(MessageExchangeContext.class);
+        partner.expects(atMostOnce()).match(invokeOnOperation("respond")).will(new CustomStub("process completed") {
+            public Object invoke(Invocation invocation) {
+                ((TestService)_testService.proxy()).completed();
+                return null;
+            }
+        });
+        partner.expects(atLeastOnce()).match(invokeOnOperation("invoke")).will(new CustomStub("invoke failing service") {
+            public Object invoke(Invocation invocation) {
+                PartnerRoleMessageExchange mex = (PartnerRoleMessageExchange) invocation.parameterValues.get(0);
+                if (((TestService)_testService.proxy()).invoke()) {
+                    Message response = mex.createMessage(mex.getOperation().getOutput().getMessage().getQName());
+                    response.setMessage(DOMUtils.newDocument().createElementNS(NAMESPACE, "tns:ResponseElement"));
+                    mex.reply(response);
+                } else {
+                    mex.replyWithFailure(MessageExchange.FailureType.COMMUNICATION_ERROR, "BangGoesInvoke", null);
+                }
+                return null;
+            }
+        });
+        partner.expects(atMostOnce()).method("onAsyncReply").will(new CustomStub("async reply") {
+            public Object invoke(Invocation invocation) {
+                // If we generate a reply after failure, e.g. by faulting the invoke.
+                return null;
+            }
+        });
+        
         _server = new MockBpelServer() {
             protected MessageExchangeContext createMessageExchangeContext() {
-                return new MessageExchangeContext() {
-
-                    public void invokePartner(final PartnerRoleMessageExchange mex) throws ContextException {
-                        if (mex.getOperation().getName().equals("invoke")) {
-                            // First fail, then succeed, that's the nature of a test case.
-                            ++_invoked;
-                            if (_invoked > _failFor) {
-                                Message response = mex.createMessage(mex.getOperation().getOutput().getMessage().getQName());
-                                response.setMessage(DOMUtils.newDocument().createElementNS(NAMESPACE, "tns:ResponseElement"));
-                                mex.reply(response);
-                            } else {
-                                mex.replyWithFailure(MessageExchange.FailureType.COMMUNICATION_ERROR, "BangGoesInvoke", null);
-                            }
-                        } else if (mex.getOperation().getName().equals("respond")) {
-                            // Happens when the process completes its last activity.
-                            _responseSent = true; 
-                        }
-                    }
-
-                    public void onAsyncReply(MyRoleMessageExchange myRoleMex) { }
-                };
+                return (MessageExchangeContext) partner.proxy();
             }
         };
         _server.deploy(new File(new URI(this.getClass().getResource("/recovery").toString())));
@@ -191,32 +244,54 @@
         _server.shutdown();
 
         _server = null;
-        _failFor = 0;
-        _invoked = 0;
         _management = null;
-        _responseSent = false;
         _processQName = null;
     }
 
+    protected InvocationMatcher invokeOnOperation(final String opName) {
+        return new StatelessInvocationMatcher() {
+            public boolean matches(Invocation invocation) {
+                return invocation.invokedMethod.getName().equals("invokePartner") &&
+                    invocation.parameterValues.size() == 1 &&
+                    ((PartnerRoleMessageExchange) invocation.parameterValues.get(0)).getOperation().getName().equals(opName);
+            }
+
+            public StringBuffer describeTo(StringBuffer buffer) {
+                return buffer.append("check that the operation ").append(opName).append(" is invoked");
+            }
+        };
+    }
+
     /**
      * Call this to execute the process so it fails the specified number of times.
      * Returns when the process has either completed, or waiting for recovery to happen.
      */
-    protected void execute(String process, int failFor) throws Exception {
-        _failFor = failFor;
+    protected void execute(String process) throws Exception {
         _management.delete(null);
         _processQName = new QName(NAMESPACE, process);
         _server.invoke(_processQName, "instantiate", DOMUtils.newDocument().createElementNS(NAMESPACE, "tns:RequestElement"));
         _server.waitForBlocking();
     }
 
+
+    protected void assertNoFailures() {
+        TFailuresInfo failures = lastInstance().getFailures();
+        assertTrue(failures == null || failures.getCount() == 0);
+        failures = _management.getProcessInfo(_processQName).getProcessInfo().getInstanceSummary().getFailures();
+        assertTrue(failures == null || failures.getCount() == 0);
+    }
+
+    protected TInstanceInfo lastInstance() {
+        return _management.listAllInstances().getInstanceInfoList().getInstanceInfoArray(0);
+    }
+
+
     /**
      * Asserts that the process has completed, successfully or not. If not,
      * it is either terminated, or faulted with the specified fault name.
      * This method also checks how many time the process invoked the service.
      */
-    protected void assertCompleted(boolean successful, int invoked, QName faultName) {
-        assertTrue(_invoked == invoked);
+    protected void assertCompleted(boolean successful, QName faultName) {
         TInstanceInfo instance = _management.listAllInstances().getInstanceInfoList().getInstanceInfoArray(0);
         // Process has completed, so no activities in the failure state.
         TFailuresInfo failures = instance.getFailures();
@@ -225,12 +300,9 @@
         assertTrue(failures == null || failures.getCount() == 0);
         if (successful) {
             assertTrue(instance.getStatus() == TInstanceStatus.COMPLETED);
-            assertTrue(_responseSent);
         } else if (faultName == null) {
             assertTrue(instance.getStatus() == TInstanceStatus.TERMINATED);
-            assertFalse(_responseSent);
         } else {
-            assertFalse(_responseSent);
             assertTrue(instance.getStatus() == TInstanceStatus.FAILED);
             TFaultInfo faultInfo = instance.getFaultInfo();
             assertTrue(faultInfo != null && faultInfo.getName().equals(faultName));
@@ -244,7 +316,6 @@
         // Process is still active, none of the completed states.
         TInstanceInfo instance = _management.listAllInstances().getInstanceInfoList().getInstanceInfoArray(0);
         assertTrue(instance.getStatus() == TInstanceStatus.ACTIVE);
-        assertFalse(_responseSent);
         // Tests here will only generate one failure.
         TFailuresInfo failures = instance.getFailures();
         assertTrue(failures != null && failures.getCount() == 1);