/*
* 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.tests.actanal.jbossas.calltracerest;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Properties;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.resolver.api.maven.Maven;
import org.junit.Test;
import org.junit.runner.RunWith;
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.ProcessStarted;
import org.overlord.rtgov.activity.model.bpm.ProcessCompleted.Status;
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.server.ActivityStoreFactory;
import org.overlord.rtgov.activity.store.mem.MemActivityStore;
import org.overlord.rtgov.call.trace.model.CallTrace;
import org.overlord.rtgov.call.trace.util.CallTraceUtil;
import org.overlord.rtgov.common.util.RTGovProperties;
import org.overlord.rtgov.common.util.RTGovPropertiesProvider;
import static org.junit.Assert.*;
@RunWith(Arquillian.class)
public class CallTraceRESTTest {
private static final String TRACE1="{\"tasks\":[{\"type\":\"Call\",\"operation\":\"op1\",\"component\":\"st1\",\"tasks\":" +
"[{\"type\":\"Task\"," +
"\"properties\":{\"processType\":\"proc1\",\"instanceId\":\"456\",\"version\":\"1\"}," +
"\"description\":\"ProcessStarted instanceId=456 processType=proc1 version=1\"," +
"\"duration\":10,\"percentage\":11},{\"type\":\"Call\",\"operation\":\"op2\",\"component\":\"st2\"," +
"\"requestLatency\":7,\"responseLatency\":8,\"tasks\":[{\"type\":\"Task\"," +
"\"properties\":{\"processType\":\"proc2\",\"instanceId\":\"123\",\"version\":\"2\"}," +
"\"description\":\"ProcessStarted " +
"instanceId=123 processType=proc2 version=2\",\"duration\":11,\"percentage\":29},{\"type\":\"Task\"," +
"\"properties\":{\"instanceId\":\"123\"},"+
"\"description\":\"ProcessCompleted instanceId=123\",\"duration\":9,\"percentage\":24}],\"duration\":37," +
"\"percentage\":42},{\"type\":\"Task\"," +
"\"properties\":{\"instanceId\":\"456\"},"+
"\"description\":\"ProcessCompleted instanceId=456\",\"duration\":16," +
"\"percentage\":18}],\"duration\":88,\"percentage\":100}]}";
private boolean _initialized=false;
@Deployment
public static WebArchive createDeployment() {
String rtgovversion=System.getProperty("rtgov.version");
String commonsversion=System.getProperty("overlord-commons.version");
String jacksonversion=System.getProperty("jackson.version");
String configversion=System.getProperty("commons-configuration.version");
String langversion=System.getProperty("commons-lang.version");
return ShrinkWrap.create(WebArchive.class, "overlord-rtgov.war")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
.setWebXML("web.xml")
.addAsLibraries(
Maven.resolver().resolve("org.overlord.rtgov.activity-management:activity-server-jee:"+rtgovversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("org.overlord.rtgov.activity-management:activity:"+rtgovversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("org.overlord.rtgov.activity-management:collector-activity-server:"+rtgovversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("org.overlord.rtgov.common:rtgov-common:"+rtgovversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("org.overlord.rtgov.integration:rtgov-jbossas:"+rtgovversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("org.overlord.rtgov.activity-management:activity-store-mem:"+rtgovversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("org.overlord.rtgov.activity-analysis:call-trace:"+rtgovversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("org.overlord.rtgov.content.services:call-trace-rests:"+rtgovversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("org.overlord:overlord-commons-services:"+commonsversion).withoutTransitivity().asSingleFile(),
//Maven.resolver().resolve("commons-configuration:commons-configuration:"+configversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("com.fasterxml.jackson.core:jackson-core:"+jacksonversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("com.fasterxml.jackson.core:jackson-databind:"+jacksonversion).withoutTransitivity().asSingleFile(),
Maven.resolver().resolve("com.fasterxml.jackson.core:jackson-annotations:"+jacksonversion).withoutTransitivity().asSingleFile()
).addAsLibraries(Maven.resolver().resolve("org.overlord:overlord-commons-config:"+commonsversion).withTransitivity().asFile()
).addAsLibraries(Maven.resolver().resolve("commons-configuration:commons-configuration:"+configversion).withTransitivity().asFile()
).addAsLibraries(Maven.resolver().resolve("commons-lang:commons-lang:"+langversion).withTransitivity().asFile());
}
@org.junit.Before
public void init() {
final java.util.Properties props=new java.util.Properties();
props.put(ActivityStoreFactory.ACTIVITY_STORE_CLASS, MemActivityStore.class.getName());
RTGovPropertiesProvider provider=new RTGovPropertiesProvider() {
public String getProperty(String name) {
return props.getProperty(name);
}
public Properties getProperties() {
return props;
}
};
RTGovProperties.setPropertiesProvider(provider);
}
protected void initActivityStore() {
org.overlord.rtgov.activity.server.ActivityStore _activityStore=ActivityStoreFactory.getActivityStore();
if (!_initialized) {
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.setTimestamp(0);
a1.setMessageId("m1");
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("m2");
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("m2");
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("m3");
a4.setReplyToId("m2");
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("m3");
a5.setReplyToId("m2");
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");
a6.setMessageId("m4");
a6.setReplyToId("m1");
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);
_activityStore.store(activities);
_initialized = true;
} catch(Exception e) {
e.printStackTrace();
fail("Failed to initialize activity store: "+e);
}
}
}
@Test
public void getCallTraceByConversationId() {
initActivityStore();
try {
// Query server
URL getUrl = new URL("http://localhost:8080/overlord-rtgov/call/trace/instance?value=1");
HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setAllowUserInteraction(false);
connection.setRequestProperty("Content-Type",
"application/json");
java.io.InputStream is=connection.getInputStream();
byte[] b = new byte[is.available()];
is.read(b);
is.close();
CallTrace ct=CallTraceUtil.deserializeCallTrace(b);
compare(ct, "getCallTrace", TRACE1);
} catch(Exception e) {
e.printStackTrace();
fail("Failed to get conversation based call trace: "+e);
}
}
@Test
public void getCallTraceByMessageId() {
initActivityStore();
try {
// Query server
URL getUrl = new URL("http://localhost:8080/overlord-rtgov/call/trace/instance?type=Message&value=m1");
HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setAllowUserInteraction(false);
connection.setRequestProperty("Content-Type",
"application/json");
java.io.InputStream is=connection.getInputStream();
byte[] b = new byte[is.available()];
is.read(b);
is.close();
CallTrace ct=CallTraceUtil.deserializeCallTrace(b);
compare(ct, "getCallTrace", TRACE1);
} catch(Exception e) {
e.printStackTrace();
fail("Failed to get message based call trace: "+e);
}
}
protected void compare(CallTrace ct, String testname, String trace) {
try {
byte[] b=CallTraceUtil.serializeCallTrace(ct);
if (b == null) {
fail("null returned");
}
System.out.println(testname+": "+new String(b));
CallTrace node2=CallTraceUtil.deserializeCallTrace(trace.getBytes());
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);
}
}
}