package org.springframework.webflow.executor; import junit.framework.TestCase; import org.easymock.EasyMock; import org.springframework.webflow.context.ExternalContextHolder; import org.springframework.webflow.core.collection.LocalAttributeMap; import org.springframework.webflow.core.collection.MutableAttributeMap; import org.springframework.webflow.definition.FlowDefinition; import org.springframework.webflow.definition.registry.FlowDefinitionLocator; import org.springframework.webflow.execution.FlowExecution; import org.springframework.webflow.execution.FlowExecutionFactory; import org.springframework.webflow.execution.FlowExecutionKey; import org.springframework.webflow.execution.FlowExecutionOutcome; import org.springframework.webflow.execution.repository.FlowExecutionLock; import org.springframework.webflow.execution.repository.FlowExecutionRepository; import org.springframework.webflow.test.GeneratedFlowExecutionKey; import org.springframework.webflow.test.MockExternalContext; import org.springframework.webflow.test.MockFlowExecutionKey; public class FlowExecutorImplTests extends TestCase { private FlowExecutor flowExecutor; // mocks private FlowDefinitionLocator locator; private FlowDefinition definition; private FlowExecutionFactory factory; private FlowExecution execution; private FlowExecutionRepository repository; private FlowExecutionLock lock; protected void setUp() { locator = EasyMock.createMock(FlowDefinitionLocator.class); definition = EasyMock.createMock(FlowDefinition.class); factory = EasyMock.createMock(FlowExecutionFactory.class); execution = EasyMock.createMock(FlowExecution.class); repository = EasyMock.createMock(FlowExecutionRepository.class); lock = EasyMock.createMock(FlowExecutionLock.class); flowExecutor = new FlowExecutorImpl(locator, factory, repository); } public void testLaunchFlowExecution() { String flowId = "foo"; MutableAttributeMap<Object> input = null; MockExternalContext context = new MockExternalContext(); EasyMock.expect(locator.getFlowDefinition(flowId)).andReturn(definition); EasyMock.expect(factory.createFlowExecution(definition)).andReturn(execution); execution.start(input, context); execution.hasEnded(); EasyMock.expectLastCall().andReturn(false); MockFlowExecutionKey flowExecutionKey = new MockFlowExecutionKey("12345"); EasyMock.expect(execution.getKey()).andReturn(flowExecutionKey); EasyMock.expect(repository.getLock(flowExecutionKey)).andReturn(lock); lock.lock(); repository.putFlowExecution(execution); lock.unlock(); EasyMock.expect(execution.getDefinition()).andReturn(definition); EasyMock.expect(definition.getId()).andReturn("foo"); EasyMock.expect(execution.getKey()).andReturn(flowExecutionKey); replayMocks(); FlowExecutionResult result = flowExecutor.launchExecution("foo", null, context); assertTrue(result.isPaused()); assertEquals("12345", result.getPausedKey()); assertFalse(result.isEnded()); assertNull(result.getOutcome()); assertNull(ExternalContextHolder.getExternalContext()); verifyMocks(); } public void testLaunchFlowExecutionEndsAfterProcessing() { String flowId = "foo"; MutableAttributeMap<Object> input = null; MockExternalContext context = new MockExternalContext(); EasyMock.expect(locator.getFlowDefinition(flowId)).andReturn(definition); EasyMock.expect(factory.createFlowExecution(definition)).andReturn(execution); execution.start(input, context); execution.hasEnded(); EasyMock.expectLastCall().andReturn(true); EasyMock.expect(execution.getDefinition()).andReturn(definition); EasyMock.expect(definition.getId()).andReturn("foo"); EasyMock.expect(execution.getOutcome()).andReturn(new FlowExecutionOutcome("finish", null)); replayMocks(); FlowExecutionResult result = flowExecutor.launchExecution("foo", null, context); assertTrue(result.isEnded()); assertEquals("finish", result.getOutcome().getId()); assertTrue(result.getOutcome().getOutput().isEmpty()); assertFalse(result.isPaused()); assertNull(result.getPausedKey()); assertNull(ExternalContextHolder.getExternalContext()); verifyMocks(); } public void testResumeFlowExecution() { String flowExecutionKey = "12345"; MockExternalContext context = new MockExternalContext(); FlowExecutionKey key = new GeneratedFlowExecutionKey(); EasyMock.expect(repository.parseFlowExecutionKey(flowExecutionKey)).andReturn(key); EasyMock.expect(repository.getLock(key)).andReturn(lock); lock.lock(); EasyMock.expect(repository.getFlowExecution(key)).andReturn(execution); execution.resume(context); execution.hasEnded(); EasyMock.expectLastCall().andReturn(false); repository.putFlowExecution(execution); EasyMock.expect(execution.getDefinition()).andReturn(definition); EasyMock.expect(definition.getId()).andReturn("foo"); EasyMock.expect(execution.getKey()).andReturn(new MockFlowExecutionKey("12345")); lock.unlock(); replayMocks(); FlowExecutionResult result = flowExecutor.resumeExecution(flowExecutionKey, context); verifyMocks(); assertTrue(result.isPaused()); assertEquals("12345", result.getPausedKey()); assertFalse(result.isEnded()); assertNull(result.getOutcome()); assertNull(ExternalContextHolder.getExternalContext()); verifyMocks(); } public void testResumeFlowExecutionEndsAfterProcessing() { String flowExecutionKey = "12345"; MockExternalContext context = new MockExternalContext(); FlowExecutionKey key = new MockFlowExecutionKey("12345"); EasyMock.expect(repository.parseFlowExecutionKey(flowExecutionKey)).andReturn(key); EasyMock.expect(repository.getLock(key)).andReturn(lock); lock.lock(); EasyMock.expect(repository.getFlowExecution(key)).andReturn(execution); execution.resume(context); execution.hasEnded(); EasyMock.expectLastCall().andReturn(true); EasyMock.expect(execution.getDefinition()).andReturn(definition); EasyMock.expect(definition.getId()).andReturn("foo"); LocalAttributeMap<Object> output = new LocalAttributeMap<Object>(); output.put("foo", "bar"); EasyMock.expect(execution.getOutcome()).andReturn(new FlowExecutionOutcome("finish", output)); repository.removeFlowExecution(execution); lock.unlock(); replayMocks(); FlowExecutionResult result = flowExecutor.resumeExecution(flowExecutionKey, context); assertTrue(result.isEnded()); assertEquals("finish", result.getOutcome().getId()); assertEquals(output, result.getOutcome().getOutput()); assertFalse(result.isPaused()); assertNull(result.getPausedKey()); assertNull(ExternalContextHolder.getExternalContext()); verifyMocks(); } private void replayMocks() { EasyMock.replay(new Object[] { locator, definition, factory, execution, repository, lock }); } private void verifyMocks() { EasyMock.verify(new Object[] { locator, definition, factory, execution, repository, lock }); } }