package ee.telekom.workflow.executor.marshall;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import ee.telekom.workflow.core.workflowinstance.WorkflowInstance;
import ee.telekom.workflow.core.workitem.WorkItem;
import ee.telekom.workflow.core.workflowinstance.WorkflowInstanceStatus;
import ee.telekom.workflow.graph.Environment;
import ee.telekom.workflow.graph.Graph;
import ee.telekom.workflow.graph.GraphFactory;
import ee.telekom.workflow.graph.GraphInstance;
import ee.telekom.workflow.graph.GraphWorkItem;
import ee.telekom.workflow.graph.Token;
import ee.telekom.workflow.graph.core.EnvironmentImpl;
import ee.telekom.workflow.graph.core.GraphEngineImpl;
import ee.telekom.workflow.graph.core.GraphInstanceImpl;
import ee.telekom.workflow.util.JsonUtil;
public class MarshallerTest{
private static final Long EXTERNAL_ID = 10l;
@Test
public void test_sequence_one(){
Graph graph = GraphFactory.INSTANCE.sequence_one();
GraphEngineImpl engine = new GraphEngineImpl();
GraphInstanceImpl instance = engine.start( graph, null, EXTERNAL_ID );
assertMarshalling( instance );
}
@Test
public void test_loop_cancelling_discriminator_twice(){
Graph graph = GraphFactory.INSTANCE.loop_cancelling_discriminator_twice( 3 );
GraphEngineImpl engine = new GraphEngineImpl();
GraphInstanceImpl instance = engine.start( graph, null, EXTERNAL_ID );
assertMarshalling( instance );
}
@Test
public void test_signal(){
Graph graph = GraphFactory.INSTANCE.signal_one_pre_post();
GraphEngineImpl engine = new GraphEngineImpl();
GraphInstanceImpl instance = engine.start( graph, null, EXTERNAL_ID );
assertMarshalling( instance );
GraphWorkItem wi = instance.getWorkItems().iterator().next();
wi.setResult( "pseudo-result" );
engine.complete( wi );
assertMarshalling( instance );
}
@Test
public void test_timer(){
Graph graph = GraphFactory.INSTANCE.timer_one_pre_post();
GraphEngineImpl engine = new GraphEngineImpl();
GraphInstanceImpl instance = engine.start( graph, null, EXTERNAL_ID );
assertMarshalling( instance );
GraphWorkItem wi = instance.getWorkItems().iterator().next();
engine.complete( wi );
assertMarshalling( instance );
}
@Test
public void test_task(){
Graph graph = GraphFactory.INSTANCE.beanasynccall_one_pre_post_special( "bean", "method", null, null );
GraphEngineImpl engine = new GraphEngineImpl();
GraphInstanceImpl instance = engine.start( graph, null, EXTERNAL_ID );
assertMarshalling( instance );
GraphWorkItem wi = instance.getWorkItems().iterator().next();
wi.setResult( "pseudo-result" );
engine.complete( wi );
assertMarshalling( instance );
}
private void assertMarshalling( GraphInstance instance1 ){
Graph graph = instance1.getGraph();
WorkflowInstance woin1 = new WorkflowInstance();
List<WorkItem> woits1 = new LinkedList<>();
Marshaller.marshall( instance1, woin1, woits1, WorkflowInstanceStatus.EXECUTED );
GraphInstance instance2 = Marshaller.unmarshall( woin1, woits1, graph );
WorkflowInstance woin2 = new WorkflowInstance();
List<WorkItem> woits2 = new LinkedList<>();
Marshaller.marshall( instance2, woin2, woits2, WorkflowInstanceStatus.EXECUTED );
// Bugs should be assert'ed in the detailed comparison of instances,
// but since this is a "easy" comparison, we also assert that the json
// representations of the state objects are equal
String json1a = JsonUtil.serialize( woin1, false );
String json2a = JsonUtil.serialize( woin2, false );
Assert.assertEquals( json1a, json2a );
String json1b = JsonUtil.serialize( woin1, false );
String json2b = JsonUtil.serialize( woin2, false );
Assert.assertEquals( json1b, json2b );
Assert.assertEquals( instance1.getGraph().getName(), instance2.getGraph().getName() );
Assert.assertEquals( instance1.getGraph().getVersion(), instance2.getGraph().getVersion() );
Assert.assertEquals( getAttributes( instance1.getEnvironment() ), getAttributes( instance2.getEnvironment() ) );
assertTokens( instance1.getTokens(), instance2.getTokens() );
Assert.assertEquals( ((GraphInstanceImpl)instance1).getTokenIdSequence(), ((GraphInstanceImpl)instance2).getTokenIdSequence() );
assertWorkItems( instance1.getWorkItems(), instance2.getWorkItems() );
}
private void assertTokens( Collection<Token> tokens1, Collection<Token> tokens2 ){
Assert.assertEquals( tokens1.size(), tokens2.size() );
for( int i = 0; i < tokens1.size(); i++ ){
Token token1 = ((List<Token>)tokens1).get( i );
Token token2 = ((List<Token>)tokens2).get( i );
Assert.assertEquals( token1.getId(), token2.getId() );
Assert.assertEquals( token1.getNode().getId(), token2.getNode().getId() );
Assert.assertEquals( getParentId( token1 ), getParentId( token2 ) );
Assert.assertEquals( token1.isActive(), token2.isActive() );
}
}
private void assertWorkItems( List<GraphWorkItem> workItems1, List<GraphWorkItem> workItems2 ){
Assert.assertEquals( workItems1.size(), workItems2.size() );
for( int i = 0; i < workItems1.size(); i++ ){
GraphWorkItem wi1 = workItems1.get( i );
GraphWorkItem wi2 = workItems2.get( i );
Assert.assertEquals( wi1.getClass(), wi2.getClass() );
Assert.assertEquals( wi1.getToken().getId(), wi2.getToken().getId() );
Assert.assertEquals( wi1.getStatus(), wi2.getStatus() );
Assert.assertEquals( wi1.getResult(), wi2.getResult() );
Assert.assertEquals( wi1.getSignal(), wi2.getSignal() );
Assert.assertEquals( wi1.getDueDate(), wi2.getDueDate() );
Assert.assertEquals( wi1.getBean(), wi2.getBean() );
Assert.assertEquals( wi1.getMethod(), wi2.getMethod() );
Assert.assertEquals( wi1.getRole(), wi2.getRole() );
Assert.assertEquals( wi1.getUser(), wi2.getUser() );
if( wi1.getBean() != null ){
Assert.assertArrayEquals( wi1.getTaskArguments(), wi2.getTaskArguments() );
}
else{
Assert.assertEquals( wi1.getHumanTaskArguments(), wi2.getHumanTaskArguments() );
}
}
}
private Map<String, Object> getAttributes( Environment env ){
return ((EnvironmentImpl)env).getAttributes();
}
private Integer getParentId( Token token ){
return token.getParent() != null ? token.getParent().getId() : null;
}
}