/*
* 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.Context;
import org.overlord.rtgov.activity.store.mem.MemActivityStore;
import org.overlord.rtgov.activity.util.ActivityUtil;
import org.overlord.rtgov.call.trace.CallTraceServiceImpl;
import org.overlord.rtgov.call.trace.model.Call;
import org.overlord.rtgov.call.trace.model.CallTrace;
import org.overlord.rtgov.call.trace.model.TraceNode;
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 CallTraceServiceImplActivitiesTest {
private static final String[] IGNORE_PROPERTIES={"client-host","client-node","server-host","server-node"};
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 testActivityUnits1() {
Context query=new Context();
query.setValue("1");
testCallTrace("ActivityUnits1", query, null);
}
@Test
public void testActivityUnits2() {
Context query=new Context();
query.setValue("1");
testCallTrace("ActivityUnits2", query, null);
}
@Test
public void testActivityUnits3Message() {
Context query=new Context();
query.setType(Context.Type.Message);
query.setValue("ID-gbrown-redhat-47657-1369065371888-0-1");
// Initial identifier is the message id
testCallTrace("ActivityUnits3", query, "Message");
}
@Test
public void testActivityUnits3Endpoint() {
Context query=new Context();
query.setType(Context.Type.Endpoint);
query.setValue("1");
// Initial identifier is the message id
testCallTrace("ActivityUnits3", query, "Endpoint");
}
protected void testCallTrace(String testName, Context query, String suffix) {
CallTraceServiceImpl ctp=getCallTraceService();
try {
java.io.InputStream is=
CallTraceUtilTest.class.getResourceAsStream(
"/activities/"+testName+".json");
byte[] b=new byte[is.available()];
is.read(b);
is.close();
ctp.getActivityServer().store(ActivityUtil.deserializeActivityUnitList(b));
} catch (Exception e) {
fail("Failed to load activity units and store in server: "+e);
}
try {
CallTrace ct=ctp.createCallTrace(query);
for (TraceNode node : ct.getTasks()) {
preProcessProperties(node);
}
compare(ct, testName, (suffix == null ? "" : suffix));
} catch (Exception e) {
e.printStackTrace();
fail("Failed to create call trace: "+e);
}
}
protected void preProcessProperties(TraceNode node) {
for (String prop : IGNORE_PROPERTIES) {
if (node.getProperties().containsKey(prop)) {
node.getProperties().put(prop, "<ignore>");
}
}
if (node instanceof Call) {
for (TraceNode tn : ((Call)node).getTasks()) {
preProcessProperties(tn);
}
}
}
protected void compare(CallTrace ct, String testname, String suffix) {
try {
byte[] b=CallTraceUtil.serializeCallTrace(ct);
if (b == null) {
fail("null returned");
}
System.out.println(testname+suffix+": "+new String(b));
java.io.InputStream is=
CallTraceUtilTest.class.getResourceAsStream(
"/calltraces/CallTrace"+testname+suffix+".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);
}
}
}