/* * 2012-3 Red Hat Inc. and/or its affiliates and other contributors. * * 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.overlord.rtgov.call.trace; import static org.junit.Assert.*; import org.junit.Test; import org.overlord.rtgov.activity.model.ActivityUnit; import org.overlord.rtgov.activity.model.Context; import org.overlord.rtgov.activity.model.Context.Type; import org.overlord.rtgov.activity.model.bpm.ProcessCompleted; import org.overlord.rtgov.activity.model.bpm.ProcessCompleted.Status; import org.overlord.rtgov.activity.model.bpm.ProcessStarted; import org.overlord.rtgov.activity.model.soa.RequestReceived; import org.overlord.rtgov.activity.model.soa.RequestSent; import org.overlord.rtgov.activity.model.soa.ResponseReceived; import org.overlord.rtgov.activity.model.soa.ResponseSent; import org.overlord.rtgov.activity.store.mem.MemActivityStore; import org.overlord.rtgov.call.trace.CallTraceServiceImpl; import org.overlord.rtgov.call.trace.CallTraceServiceImpl.CTState; import org.overlord.rtgov.call.trace.model.CallTrace; import org.overlord.rtgov.call.trace.util.CallTraceUtil; import org.overlord.rtgov.call.trace.util.CallTraceUtilTest; import org.overlord.rtgov.internal.activity.server.jee.JEEActivityServer; public class CallTraceServiceImplTest { protected CallTraceServiceImpl getCallTraceService() { CallTraceServiceImpl ctp=new CallTraceServiceImpl(); MemActivityStore memas=new MemActivityStore(); JEEActivityServer as=new JEEActivityServer(); as.setActivityStore(memas); ctp.setActivityServer(as); return (ctp); } @Test public void testIncludeRelatedAUByContext() { CallTraceServiceImpl ctp=getCallTraceService(); CTState state=new CTState(); ActivityUnit au1=new ActivityUnit(); ActivityUnit au2=new ActivityUnit(); RequestSent rs1=new RequestSent(); RequestSent rs2=new RequestSent(); au1.getActivityTypes().add(rs1); au2.getActivityTypes().add(rs2); Context c1=new Context(); c1.setValue("1"); rs1.getContext().add(c1); Context c2=new Context(); c2.setValue("1"); rs2.getContext().add(c2); java.util.List<ActivityUnit> aus=new java.util.ArrayList<ActivityUnit>(); aus.add(au1); aus.add(au2); try { ctp.getActivityServer().store(aus); } catch (Exception e) { fail("Failed to store activities: "+e); } Context query=new Context(); query.setValue("1"); ctp.loadActivityUnits(state, query, null); if (state.getActivityUnits().size() != 2) { fail("Expecting 2 activity units: "+state.getActivityUnits().size()); } if (!state.getActivityUnits().contains(au1)) { fail("AU1 not in list"); } if (!state.getActivityUnits().contains(au2)) { fail("AU2 not in list"); } } @Test public void testIncludeRelatedAUByIndirectContext() { CallTraceServiceImpl ctp=getCallTraceService(); CTState state=new CTState(); ActivityUnit au1=new ActivityUnit(); ActivityUnit au2=new ActivityUnit(); RequestSent rs1=new RequestSent(); RequestSent rs2=new RequestSent(); au1.getActivityTypes().add(rs1); au2.getActivityTypes().add(rs2); Context c1=new Context(); c1.setValue("1"); rs1.getContext().add(c1); Context c1link=new Context(); c1link.setValue("2"); rs1.getContext().add(c1link); Context c2=new Context(); c2.setValue("2"); rs2.getContext().add(c2); java.util.List<ActivityUnit> aus=new java.util.ArrayList<ActivityUnit>(); aus.add(au1); aus.add(au2); try { ctp.getActivityServer().store(aus); } catch (Exception e) { fail("Failed to store activities: "+e); } Context query=new Context(); query.setValue("1"); ctp.loadActivityUnits(state, query, null); if (state.getActivityUnits().size() != 2) { fail("Expecting 2 activity units: "+state.getActivityUnits().size()); } if (!state.getActivityUnits().contains(au1)) { fail("AU1 not in list"); } if (!state.getActivityUnits().contains(au2)) { fail("AU2 not in list"); } } @Test public void testDoNotLoadExistingCorrelation() { CallTraceServiceImpl ctp=getCallTraceService(); CTState state=new CTState(); ActivityUnit au1=new ActivityUnit(); ActivityUnit au2=new ActivityUnit(); RequestSent rs1=new RequestSent(); RequestSent rs2=new RequestSent(); au1.getActivityTypes().add(rs1); au2.getActivityTypes().add(rs2); Context c1=new Context(); c1.setValue("1"); rs1.getContext().add(c1); Context c1link=new Context(); c1link.setValue("2"); rs1.getContext().add(c1link); Context c2=new Context(); c2.setValue("2"); rs2.getContext().add(c2); java.util.List<ActivityUnit> aus=new java.util.ArrayList<ActivityUnit>(); aus.add(au1); aus.add(au2); try { ctp.getActivityServer().store(aus); } catch (Exception e) { fail("Failed to store activities: "+e); } // Mark correlation value '2' as already initialized Context existingContext=new Context(); existingContext.setValue("2"); state.initialized(existingContext); Context query=new Context(); query.setValue("1"); ctp.loadActivityUnits(state, query, null); if (state.getActivityUnits().size() != 1) { fail("Expecting 1 activity unit: "+state.getActivityUnits().size()); } if (!state.getActivityUnits().contains(au1)) { fail("AU1 should be in state"); } } @Test public void testSortActivityUnits1() { CTState state=new CTState(); ActivityUnit au1=new ActivityUnit(); ActivityUnit au2=new ActivityUnit(); RequestSent rs1=new RequestSent(); RequestSent rs2=new RequestSent(); rs1.setTimestamp(System.currentTimeMillis()); rs2.setTimestamp(System.currentTimeMillis()+20); au1.getActivityTypes().add(rs1); au2.getActivityTypes().add(rs2); state.getActivityUnits().add(au1); state.getActivityUnits().add(au2); state.sortActivityUnitsByTime(); if (state.getActivityUnits().get(0) != au1) { fail("Expecting au1 at pos 0"); } if (state.getActivityUnits().get(1) != au2) { fail("Expecting au2 at pos 1"); } } @Test public void testSortActivityUnits2() { CTState state=new CTState(); ActivityUnit au1=new ActivityUnit(); ActivityUnit au2=new ActivityUnit(); RequestSent rs1=new RequestSent(); RequestSent rs2=new RequestSent(); rs1.setTimestamp(System.currentTimeMillis()); rs2.setTimestamp(System.currentTimeMillis()+20); au1.getActivityTypes().add(rs1); au2.getActivityTypes().add(rs2); state.getActivityUnits().add(au2); state.getActivityUnits().add(au1); state.sortActivityUnitsByTime(); if (state.getActivityUnits().get(0) != au1) { fail("Expecting au1 at pos 0"); } if (state.getActivityUnits().get(1) != au2) { fail("Expecting au2 at pos 1"); } } @Test public void testCursorAllActivityTypes() { ActivityUnit au1=new ActivityUnit(); RequestSent rs1=new RequestSent(); RequestReceived rr2=new RequestReceived(); au1.getActivityTypes().add(rs1); au1.getActivityTypes().add(rr2); CallTraceServiceImpl.ActivityUnitCursor cursor= new CallTraceServiceImpl.ActivityUnitCursor(au1); if (cursor.getActivityTypes().size() != 2) { fail("Expecting 2 events: "+cursor.getActivityTypes().size()); } } @Test public void testCursorRemainingActivityTypes() { ActivityUnit au1=new ActivityUnit(); RequestSent rs1=new RequestSent(); RequestReceived rr2=new RequestReceived(); au1.getActivityTypes().add(rs1); au1.getActivityTypes().add(rr2); CallTraceServiceImpl.ActivityUnitCursor cursor= new CallTraceServiceImpl.ActivityUnitCursor(au1); cursor.next(); if (cursor.getActivityTypes().size() != 1) { fail("Expecting 1 events: "+cursor.getActivityTypes().size()); } } @Test public void testCursorPeek() { ActivityUnit au1=new ActivityUnit(); RequestSent rs1=new RequestSent(); RequestReceived rr2=new RequestReceived(); au1.getActivityTypes().add(rs1); au1.getActivityTypes().add(rr2); CallTraceServiceImpl.ActivityUnitCursor cursor= new CallTraceServiceImpl.ActivityUnitCursor(au1); if (cursor.peek() != rs1) { fail("Peek should return rs1"); } } @Test public void testCursorNextThenPeek() { ActivityUnit au1=new ActivityUnit(); RequestSent rs1=new RequestSent(); RequestReceived rr2=new RequestReceived(); au1.getActivityTypes().add(rs1); au1.getActivityTypes().add(rr2); CallTraceServiceImpl.ActivityUnitCursor cursor= new CallTraceServiceImpl.ActivityUnitCursor(au1); if (cursor.next() != rs1) { fail("Next should return rs1"); } if (cursor.peek() != rr2) { fail("Peek should return rr2"); } } @Test public void testCursorNextWhenEmpty() { ActivityUnit au1=new ActivityUnit(); RequestSent rs1=new RequestSent(); RequestReceived rr2=new RequestReceived(); au1.getActivityTypes().add(rs1); au1.getActivityTypes().add(rr2); CallTraceServiceImpl.ActivityUnitCursor cursor= new CallTraceServiceImpl.ActivityUnitCursor(au1); if (cursor.next() != rs1) { fail("Next should return rs1"); } if (cursor.next() != rr2) { fail("Peek should return rr2"); } if (cursor.next() != null) { fail("Cursor should now be empty"); } } @Test public void testTopLevelAUs1() { ActivityUnit au1=new ActivityUnit(); RequestReceived rr1=new RequestReceived(); rr1.setServiceType("st1"); rr1.setOperation("op1"); au1.getActivityTypes().add(rr1); ActivityUnit au2=new ActivityUnit(); RequestReceived rr2=new RequestReceived(); rr2.setServiceType("st2"); rr2.setOperation("op2"); au2.getActivityTypes().add(rr2); CTState state=new CTState(); state.add(au1); state.add(au2); java.util.List<ActivityUnit> tl=CallTraceServiceImpl.getTopLevelAUs(state); if (tl.size() != 2) { fail("Should be two top level aus: "+tl.size()); } } @Test public void testTopLevelAUs2() { ActivityUnit au1=new ActivityUnit(); RequestReceived rr1=new RequestReceived(); rr1.setServiceType("st1"); rr1.setOperation("op1"); au1.getActivityTypes().add(rr1); ActivityUnit au2=new ActivityUnit(); RequestReceived rr2=new RequestReceived(); rr2.setServiceType("st2"); rr2.setOperation("op2"); au2.getActivityTypes().add(rr2); ActivityUnit au3=new ActivityUnit(); RequestSent rs2=new RequestSent(); rs2.setServiceType("st2"); rs2.setOperation("op2"); au3.getActivityTypes().add(rs2); CTState state=new CTState(); state.add(au1); state.add(au2); state.add(au3); java.util.List<ActivityUnit> tl=CallTraceServiceImpl.getTopLevelAUs(state); if (tl.size() != 1) { fail("Should be 1 top level aus: "+tl.size()); } if (tl.get(0) != au1) { fail("Should be au1"); } } @Test public void testProcessAUSingleUnit2Service() { ActivityUnit au1=new ActivityUnit(); au1.setId("au1"); RequestReceived a1=new RequestReceived(); a1.setServiceType("st1"); a1.setOperation("op1"); a1.setTimestamp(0); au1.getActivityTypes().add(a1); ProcessStarted p1=new ProcessStarted(); p1.setProcessType("proc1"); p1.setVersion("1"); p1.setInstanceId("456"); p1.setTimestamp(10); au1.getActivityTypes().add(p1); RequestSent a2=new RequestSent(); a2.setServiceType("st2"); a2.setOperation("op2"); a2.setTimestamp(30); au1.getActivityTypes().add(a2); RequestReceived a3=new RequestReceived(); a3.setServiceType("st2"); a3.setOperation("op2"); a3.setTimestamp(37); au1.getActivityTypes().add(a3); ProcessStarted p2=new ProcessStarted(); p2.setProcessType("proc2"); p2.setVersion("2"); p2.setInstanceId("123"); p2.setTimestamp(48); au1.getActivityTypes().add(p2); ProcessCompleted p3=new ProcessCompleted(); p3.setInstanceId("123"); p3.setStatus(Status.Success); p3.setTimestamp(57); au1.getActivityTypes().add(p3); ResponseSent a4=new ResponseSent(); a4.setServiceType("st2"); a4.setOperation("op2"); a4.setTimestamp(59); au1.getActivityTypes().add(a4); ResponseReceived a5=new ResponseReceived(); a5.setServiceType("st2"); a5.setOperation("op2"); a5.setTimestamp(67); au1.getActivityTypes().add(a5); ProcessCompleted p4=new ProcessCompleted(); p4.setInstanceId("456"); p4.setStatus(Status.Fail); p4.setTimestamp(83); au1.getActivityTypes().add(p4); ResponseSent a6=new ResponseSent(); a6.setServiceType("st1"); a6.setOperation("op1"); a6.setTimestamp(88); au1.getActivityTypes().add(a6); CTState state=new CTState(); au1.init(); state.add(au1); CallTrace ct=CallTraceServiceImpl.processAUs(state); compare(ct, "SingleUnit2Service", "CallTrace1"); } @Test public void testProcessAUSeparateUnits2Service() { ActivityUnit au1=new ActivityUnit(); au1.setId("au1"); ActivityUnit au2=new ActivityUnit(); au2.setId("au2"); RequestReceived a1=new RequestReceived(); a1.setServiceType("st1"); a1.setOperation("op1"); a1.setTimestamp(0); au1.getActivityTypes().add(a1); ProcessStarted p1=new ProcessStarted(); p1.setProcessType("proc1"); p1.setVersion("1"); p1.setInstanceId("456"); p1.setTimestamp(10); au1.getActivityTypes().add(p1); RequestSent a2=new RequestSent(); a2.setServiceType("st2"); a2.setOperation("op2"); a2.setTimestamp(30); au1.getActivityTypes().add(a2); RequestReceived a3=new RequestReceived(); a3.setServiceType("st2"); a3.setOperation("op2"); a3.setTimestamp(37); au2.getActivityTypes().add(a3); ProcessStarted p2=new ProcessStarted(); p2.setProcessType("proc2"); p2.setVersion("2"); p2.setInstanceId("123"); p2.setTimestamp(48); au2.getActivityTypes().add(p2); ProcessCompleted p3=new ProcessCompleted(); p3.setInstanceId("123"); p3.setStatus(Status.Success); p3.setTimestamp(57); au2.getActivityTypes().add(p3); ResponseSent a4=new ResponseSent(); a4.setServiceType("st2"); a4.setOperation("op2"); a4.setTimestamp(59); au2.getActivityTypes().add(a4); ResponseReceived a5=new ResponseReceived(); a5.setServiceType("st2"); a5.setOperation("op2"); a5.setTimestamp(67); au1.getActivityTypes().add(a5); ProcessCompleted p4=new ProcessCompleted(); p4.setInstanceId("456"); p4.setStatus(Status.Fail); p4.setTimestamp(83); au1.getActivityTypes().add(p4); ResponseSent a6=new ResponseSent(); a6.setServiceType("st1"); a6.setOperation("op1"); a6.setTimestamp(88); au1.getActivityTypes().add(a6); CTState state=new CTState(); au1.init(); state.add(au1); au2.init(); state.add(au2); CallTrace ct=CallTraceServiceImpl.processAUs(state); compare(ct, "SeparateUnits2Service", "CallTrace1"); } @Test public void testProcessAUSeparateUnits2Service2() { ActivityUnit au1=new ActivityUnit(); au1.setId("au1"); ActivityUnit au2=new ActivityUnit(); au2.setId("au2"); ActivityUnit au3=new ActivityUnit(); au3.setId("au3"); RequestReceived a1=new RequestReceived(); a1.setServiceType("st1"); a1.setOperation("op1"); a1.setTimestamp(0); au1.getActivityTypes().add(a1); ProcessStarted p1=new ProcessStarted(); p1.setProcessType("proc1"); p1.setVersion("1"); p1.setInstanceId("456"); p1.setTimestamp(10); au1.getActivityTypes().add(p1); RequestSent a2=new RequestSent(); a2.setServiceType("st2"); a2.setOperation("op2"); a2.setTimestamp(30); au1.getActivityTypes().add(a2); RequestReceived a3=new RequestReceived(); a3.setServiceType("st2"); a3.setOperation("op2"); a3.setTimestamp(37); au2.getActivityTypes().add(a3); ProcessStarted p2=new ProcessStarted(); p2.setProcessType("proc2"); p2.setVersion("2"); p2.setInstanceId("123"); p2.setTimestamp(48); au2.getActivityTypes().add(p2); ProcessCompleted p3=new ProcessCompleted(); p3.setInstanceId("123"); p3.setStatus(Status.Success); p3.setTimestamp(57); au3.getActivityTypes().add(p3); ResponseSent a4=new ResponseSent(); a4.setServiceType("st2"); a4.setOperation("op2"); a4.setTimestamp(59); au3.getActivityTypes().add(a4); ResponseReceived a5=new ResponseReceived(); a5.setServiceType("st2"); a5.setOperation("op2"); a5.setTimestamp(67); au1.getActivityTypes().add(a5); ProcessCompleted p4=new ProcessCompleted(); p4.setInstanceId("456"); p4.setStatus(Status.Fail); p4.setTimestamp(83); au1.getActivityTypes().add(p4); ResponseSent a6=new ResponseSent(); a6.setServiceType("st1"); a6.setOperation("op1"); a6.setTimestamp(88); au1.getActivityTypes().add(a6); CTState state=new CTState(); au1.init(); state.add(au1); au2.init(); state.add(au2); au3.init(); state.add(au3); CallTrace ct=CallTraceServiceImpl.processAUs(state); compare(ct, "SeparateUnits2Service2", "CallTrace1"); } @Test public void testProcessAUSingleUnit2ServiceFault() { ActivityUnit au1=new ActivityUnit(); au1.setId("au1"); RequestReceived a1=new RequestReceived(); a1.setServiceType("st1"); a1.setOperation("op1"); a1.setTimestamp(0); au1.getActivityTypes().add(a1); ProcessStarted p1=new ProcessStarted(); p1.setProcessType("proc1"); p1.setVersion("1"); p1.setInstanceId("456"); p1.setTimestamp(10); au1.getActivityTypes().add(p1); RequestSent a2=new RequestSent(); a2.setServiceType("st2"); a2.setOperation("op2"); a2.setTimestamp(30); au1.getActivityTypes().add(a2); RequestReceived a3=new RequestReceived(); a3.setServiceType("st2"); a3.setOperation("op2"); a3.setTimestamp(37); au1.getActivityTypes().add(a3); ProcessStarted p2=new ProcessStarted(); p2.setProcessType("proc2"); p2.setVersion("2"); p2.setInstanceId("123"); p2.setTimestamp(48); au1.getActivityTypes().add(p2); ProcessCompleted p3=new ProcessCompleted(); p3.setInstanceId("123"); p3.setStatus(Status.Success); p3.setTimestamp(57); au1.getActivityTypes().add(p3); ResponseSent a4=new ResponseSent(); a4.setServiceType("st2"); a4.setOperation("op2"); a4.setFault("Failed"); a4.setTimestamp(59); au1.getActivityTypes().add(a4); ResponseReceived a5=new ResponseReceived(); a5.setServiceType("st2"); a5.setOperation("op2"); a5.setFault("Failed"); a5.setTimestamp(67); au1.getActivityTypes().add(a5); ProcessCompleted p4=new ProcessCompleted(); p4.setInstanceId("456"); p4.setStatus(Status.Fail); p4.setTimestamp(83); au1.getActivityTypes().add(p4); ResponseSent a6=new ResponseSent(); a6.setServiceType("st1"); a6.setOperation("op1"); a6.setTimestamp(88); au1.getActivityTypes().add(a6); CTState state=new CTState(); au1.init(); state.add(au1); CallTrace ct=CallTraceServiceImpl.processAUs(state); compare(ct, "SingleUnit2ServiceFault", "CallTrace2"); } @Test public void testProcessAUSeparateUnits2ServiceOneWayWithSentResp() { ActivityUnit au1=new ActivityUnit(); au1.setId("au1"); ActivityUnit au2=new ActivityUnit(); au2.setId("au2"); ActivityUnit au3=new ActivityUnit(); au3.setId("au3"); RequestReceived a1=new RequestReceived(); a1.setServiceType("st1"); a1.setOperation("op1"); a1.setTimestamp(0); au1.getActivityTypes().add(a1); ProcessStarted p1=new ProcessStarted(); p1.setProcessType("proc1"); p1.setVersion("1"); p1.setInstanceId("456"); p1.setTimestamp(10); au1.getActivityTypes().add(p1); RequestSent a2=new RequestSent(); a2.setServiceType("st2"); a2.setOperation("op2"); a2.setTimestamp(30); au1.getActivityTypes().add(a2); RequestReceived a3=new RequestReceived(); a3.setServiceType("st2"); a3.setOperation("op2"); a3.setTimestamp(37); au2.getActivityTypes().add(a3); ProcessStarted p2=new ProcessStarted(); p2.setProcessType("proc2"); p2.setVersion("2"); p2.setInstanceId("123"); p2.setTimestamp(48); au2.getActivityTypes().add(p2); ProcessCompleted p3=new ProcessCompleted(); p3.setInstanceId("123"); p3.setStatus(Status.Success); p3.setTimestamp(57); au3.getActivityTypes().add(p3); ResponseSent a4=new ResponseSent(); a4.setServiceType("st2"); a4.setOperation("op2"); a4.setTimestamp(59); au3.getActivityTypes().add(a4); // NO RESPONSE RECEIVED ProcessCompleted p4=new ProcessCompleted(); p4.setInstanceId("456"); p4.setStatus(Status.Fail); p4.setTimestamp(83); au1.getActivityTypes().add(p4); ResponseSent a6=new ResponseSent(); a6.setServiceType("st1"); a6.setOperation("op1"); a6.setTimestamp(88); au1.getActivityTypes().add(a6); CTState state=new CTState(); au1.init(); state.add(au1); au2.init(); state.add(au2); au3.init(); state.add(au3); CallTrace ct=CallTraceServiceImpl.processAUs(state); compare(ct, "testProcessAUSeparateUnits2ServiceOneWayWithSentResp", "CallTrace3"); } @Test public void testProcessAUSeparateUnits2ServiceOneWayNoResp() { ActivityUnit au1=new ActivityUnit(); au1.setId("au1"); ActivityUnit au2=new ActivityUnit(); au2.setId("au2"); ActivityUnit au3=new ActivityUnit(); au3.setId("au3"); RequestReceived a1=new RequestReceived(); a1.setServiceType("st1"); a1.setOperation("op1"); a1.setTimestamp(0); au1.getActivityTypes().add(a1); ProcessStarted p1=new ProcessStarted(); p1.setProcessType("proc1"); p1.setVersion("1"); p1.setInstanceId("456"); p1.setTimestamp(10); au1.getActivityTypes().add(p1); RequestSent a2=new RequestSent(); a2.setServiceType("st2"); a2.setOperation("op2"); a2.setTimestamp(30); au1.getActivityTypes().add(a2); RequestReceived a3=new RequestReceived(); a3.setServiceType("st2"); a3.setOperation("op2"); a3.setTimestamp(37); au2.getActivityTypes().add(a3); ProcessStarted p2=new ProcessStarted(); p2.setProcessType("proc2"); p2.setVersion("2"); p2.setInstanceId("123"); p2.setTimestamp(48); au2.getActivityTypes().add(p2); ProcessCompleted p3=new ProcessCompleted(); p3.setInstanceId("123"); p3.setStatus(Status.Success); p3.setTimestamp(57); au3.getActivityTypes().add(p3); // NO RESPONSE SENT OR RECEIVED ProcessCompleted p4=new ProcessCompleted(); p4.setInstanceId("456"); p4.setStatus(Status.Fail); p4.setTimestamp(83); au1.getActivityTypes().add(p4); ResponseSent a6=new ResponseSent(); a6.setServiceType("st1"); a6.setOperation("op1"); a6.setTimestamp(88); au1.getActivityTypes().add(a6); CTState state=new CTState(); au1.init(); state.add(au1); au2.init(); state.add(au2); au3.init(); state.add(au3); CallTrace ct=CallTraceServiceImpl.processAUs(state); compare(ct, "testProcessAUSeparateUnits2ServiceOneWayNoResp", "CallTrace3"); } @Test public void testProcessAUSOAAndBPMInterleaved() { try { ActivityUnit au1=new ActivityUnit(); au1.setId("au1"); ActivityUnit au2=new ActivityUnit(); au2.setId("au2"); ActivityUnit au3=new ActivityUnit(); au3.setId("au3"); RequestReceived a1=new RequestReceived(); a1.setServiceType("st1"); a1.setOperation("op1"); a1.setMessageId("m0"); a1.setTimestamp(0); a1.getContext().add(new Context(Type.Conversation, "1")); au1.getActivityTypes().add(a1); ProcessStarted p1=new ProcessStarted(); p1.setProcessType("proc1"); p1.setVersion("1"); p1.setInstanceId("456"); p1.setTimestamp(10); au1.getActivityTypes().add(p1); RequestSent a2=new RequestSent(); a2.setServiceType("st2"); a2.setOperation("op2"); a2.setMessageId("m1"); a2.setTimestamp(30); a2.getContext().add(new Context(Type.Conversation, "1")); au1.getActivityTypes().add(a2); RequestReceived a3=new RequestReceived(); a3.setServiceType("st2"); a3.setOperation("op2"); a3.setMessageId("m1"); a3.setTimestamp(37); a3.getContext().add(new Context(Type.Conversation, "1")); au2.getActivityTypes().add(a3); ProcessStarted p2=new ProcessStarted(); p2.setProcessType("proc2"); p2.setVersion("2"); p2.setInstanceId("123"); p2.setTimestamp(48); au2.getActivityTypes().add(p2); ProcessCompleted p3=new ProcessCompleted(); p3.setInstanceId("123"); p3.setStatus(Status.Success); p3.setTimestamp(57); au3.getActivityTypes().add(p3); ResponseSent a4=new ResponseSent(); a4.setServiceType("st2"); a4.setOperation("op2"); a4.setMessageId("m2"); a4.setReplyToId("m1"); a4.setTimestamp(59); a4.getContext().add(new Context(Type.Conversation, "1")); au3.getActivityTypes().add(a4); ResponseReceived a5=new ResponseReceived(); a5.setServiceType("st2"); a5.setOperation("op2"); a5.setMessageId("m2"); a5.setReplyToId("m1"); a5.setTimestamp(67); a5.getContext().add(new Context(Type.Conversation, "1")); au1.getActivityTypes().add(a5); ProcessCompleted p4=new ProcessCompleted(); p4.setInstanceId("456"); p4.setStatus(Status.Fail); p4.setTimestamp(83); au1.getActivityTypes().add(p4); ResponseSent a6=new ResponseSent(); a6.setServiceType("st1"); a6.setOperation("op1"); a4.setMessageId("m3"); a4.setReplyToId("m0"); a6.setTimestamp(88); a6.getContext().add(new Context(Type.Conversation, "1")); au1.getActivityTypes().add(a6); au1.init(); au2.init(); au3.init(); java.util.List<ActivityUnit> activities=new java.util.ArrayList<ActivityUnit>(); activities.add(au1); activities.add(au2); activities.add(au3); CTState state=new CTState(); au1.init(); state.add(au1); au2.init(); state.add(au2); au3.init(); state.add(au3); CallTrace ct=CallTraceServiceImpl.processAUs(state); compare(ct, "testProcessAUSOAAndBPMInterleaved", "CallTrace4"); } catch(Exception e) { e.printStackTrace(); fail("Failed to access activity server: "+e); } } protected void compare(CallTrace ct, String testname, String filename) { try { byte[] b=CallTraceUtil.serializeCallTrace(ct); if (b == null) { fail("null returned"); } System.out.println(testname+": "+new String(b)); java.io.InputStream is= CallTraceUtilTest.class.getResourceAsStream( "/calltraces/"+filename+".json"); byte[] inb2=new byte[is.available()]; is.read(inb2); is.close(); CallTrace node2=CallTraceUtil.deserializeCallTrace(inb2); byte[] b2=CallTraceUtil.serializeCallTrace(node2); String s1=new String(b); String s2=new String(b2); if (!s1.equals(s2)) { int pos=-1; for (int i=0; i < s1.length(); ++i) { if (i >= s2.length()) { break; } if (s1.charAt(i) != s2.charAt(i)) { pos = i; break; } } if (pos != -1) { pos -= 15; if (pos < 0) { pos = 0; } int endpos=pos+40; if (endpos >= s1.length()) { endpos = s1.length(); } if (endpos >= s2.length()) { endpos = s2.length(); } System.out.println("DIFF:\r\n"+s1.substring(pos, endpos)+"\r\n"+s2.substring(pos, endpos)); } fail("JSON is different: created="+s1+" stored="+s2); } } catch(Exception e) { e.printStackTrace(); fail("Failed to serialize: "+e); } } }