/*
* 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.service.dependency.svg;
import static org.junit.Assert.*;
import java.util.Collections;
import org.junit.Test;
import org.overlord.rtgov.activity.model.ActivityUnit;
import org.overlord.rtgov.activity.util.ActivityUtil;
import org.overlord.rtgov.analytics.service.InterfaceDefinition;
import org.overlord.rtgov.analytics.service.InvocationDefinition;
import org.overlord.rtgov.analytics.service.OperationDefinition;
import org.overlord.rtgov.analytics.service.RequestFaultDefinition;
import org.overlord.rtgov.analytics.service.RequestResponseDefinition;
import org.overlord.rtgov.analytics.service.ServiceDefinition;
import org.overlord.rtgov.analytics.situation.Situation;
import org.overlord.rtgov.analytics.util.ServiceDefinitionUtil;
import org.overlord.rtgov.service.dependency.ServiceDependencyBuilder;
import org.overlord.rtgov.service.dependency.ServiceGraph;
import org.overlord.rtgov.service.dependency.ServiceNode;
import org.overlord.rtgov.service.dependency.layout.LayoutFactory;
import org.overlord.rtgov.service.dependency.layout.ServiceGraphLayout;
import org.overlord.rtgov.service.dependency.layout.ServiceGraphLayoutImpl;
import org.overlord.rtgov.service.dependency.presentation.Severity;
import org.overlord.rtgov.service.dependency.svg.SVGServiceGraphGenerator;
public class SVGServiceGraphGeneratorTest {
private static final String FAULT2 = "Fault2";
private static final String OP5 = "op5";
private static final String OP4 = "op4";
private static final String OP3 = "op3";
private static final String OP2 = "op2";
private static final String OP1 = "op1";
private static final String INTERFACE1 = "intf1";
private static final String INTERFACE2 = "intf2";
private static final String INTERFACE3 = "intf3";
private static final String INTERFACE4 = "intf4";
private static final String SERVICE_TYPE1 = "serviceType1";
private static final String SERVICE_TYPE2 = "serviceType2";
private static final String SERVICE_TYPE3 = "serviceType3";
private static final String SERVICE_TYPE4 = "serviceType4";
//@Test
public void testLoadMainTemplate() {
if (new SVGServiceGraphGenerator().loadTemplate("main") == null) {
fail("Failed to load SVG template");
}
}
@Test
public void testLayoutGraph() {
ServiceDefinition sd1=new ServiceDefinition();
sd1.setServiceType(SERVICE_TYPE1);
InterfaceDefinition idef1=new InterfaceDefinition();
idef1.setInterface(INTERFACE1);
sd1.getInterfaces().add(idef1);
OperationDefinition op1=new OperationDefinition();
op1.setName(OP1);
idef1.getOperations().add(op1);
RequestResponseDefinition rrd1=new RequestResponseDefinition();
op1.setRequestResponse(rrd1);
InvocationDefinition id1=new InvocationDefinition();
id1.setInterface(INTERFACE2);
id1.setOperation(OP2);
rrd1.getInvocations().add(id1);
id1.getMetrics().setCount(5);
id1.getMetrics().setFaults(3);
id1.getMetrics().setAverage(200);
id1.getMetrics().setMax(220);
id1.getMetrics().setMin(140);
InvocationDefinition id1b=new InvocationDefinition();
id1b.setInterface(INTERFACE4);
id1b.setOperation(OP4);
rrd1.getInvocations().add(id1b);
id1b.getMetrics().setCount(8);
id1b.getMetrics().setFaults(2);
id1b.getMetrics().setAverage(250);
id1b.getMetrics().setMax(255);
id1b.getMetrics().setMin(140);
ServiceDefinition sd2=new ServiceDefinition();
sd2.setServiceType(SERVICE_TYPE2);
InterfaceDefinition idef2=new InterfaceDefinition();
idef2.setInterface(INTERFACE2);
sd2.getInterfaces().add(idef2);
OperationDefinition op2=new OperationDefinition();
op2.setName(OP2);
idef2.getOperations().add(op2);
RequestResponseDefinition rrd2=new RequestResponseDefinition();
op2.setRequestResponse(rrd2);
rrd2.getMetrics().setCount(2);
rrd2.getMetrics().setAverage(100);
rrd2.getMetrics().setMax(200);
rrd2.getMetrics().setMin(20);
InvocationDefinition id2c=new InvocationDefinition();
id2c.setInterface(INTERFACE3);
id2c.setOperation(OP3);
rrd2.getInvocations().add(id2c);
id2c.getMetrics().setCount(2);
id2c.getMetrics().setAverage(100);
id2c.getMetrics().setMax(200);
id2c.getMetrics().setMin(20);
RequestFaultDefinition rfd2=new RequestFaultDefinition();
rfd2.setFault(FAULT2);
op2.getRequestFaults().add(rfd2);
rfd2.getMetrics().setCount(3);
rfd2.getMetrics().setFaults(3);
rfd2.getMetrics().setAverage(80);
rfd2.getMetrics().setMax(180);
rfd2.getMetrics().setMin(50);
InvocationDefinition id2b=new InvocationDefinition();
id2b.setInterface(INTERFACE3);
id2b.setOperation(OP3);
rfd2.getInvocations().add(id2b);
id2b.getMetrics().setCount(1);
id2b.getMetrics().setAverage(90);
id2b.getMetrics().setMax(90);
id2b.getMetrics().setMin(90);
ServiceDefinition sd3=new ServiceDefinition();
sd3.setServiceType(SERVICE_TYPE3);
InterfaceDefinition idef3=new InterfaceDefinition();
idef3.setInterface(INTERFACE3);
sd3.getInterfaces().add(idef3);
OperationDefinition op3=new OperationDefinition();
op3.setName(OP3);
idef3.getOperations().add(op3);
op3.getMetrics().setCount(3);
op3.getMetrics().setAverage(80);
op3.getMetrics().setMax(180);
op3.getMetrics().setMin(50);
ServiceDefinition sd4=new ServiceDefinition();
sd4.setServiceType(SERVICE_TYPE4);
InterfaceDefinition idef4=new InterfaceDefinition();
idef4.setInterface(INTERFACE4);
sd4.getInterfaces().add(idef4);
OperationDefinition op4=new OperationDefinition();
op4.setName(OP4);
idef4.getOperations().add(op4);
OperationDefinition op5=new OperationDefinition();
op5.setName(OP5);
idef4.getOperations().add(op5);
java.util.Set<ServiceDefinition> sds=new java.util.HashSet<ServiceDefinition>();
sds.add(sd1);
sds.add(sd2);
sds.add(sd3);
sds.add(sd4);
java.util.List<Situation> sits=new java.util.ArrayList<Situation>();
Situation sit1=new Situation();
sit1.setSeverity(Situation.Severity.Critical);
sit1.setSubject(SERVICE_TYPE1);
sit1.setType("SLA Violation");
sit1.setDescription("Service exceeded SLA");
sits.add(sit1);
Situation sit2=new Situation();
sit2.setSeverity(Situation.Severity.High);
sit2.setSubject(SERVICE_TYPE1);
sit2.setType("SLA Warning");
sit2.setDescription("Service close to violating SLA");
sits.add(sit2);
Situation sit3=new Situation();
sit3.setSeverity(Situation.Severity.High);
sit3.setSubject(SERVICE_TYPE2+"/"+OP2+"/"+FAULT2);
sit3.setType("SLA Violation");
sit3.setDescription("Service exceeded SLA");
sits.add(sit3);
Situation sit4=new Situation();
sit4.setSeverity(Situation.Severity.Low);
sit4.setSubject(SERVICE_TYPE4+"/"+OP4);
sit4.setType("SLA Violation");
sit4.setDescription("Service exceeded SLA");
sits.add(sit4);
Situation sit5=new Situation();
sit5.setSeverity(Situation.Severity.Medium);
sit5.setSubject(SERVICE_TYPE4+"/"+OP5);
sit5.setType("SLA Violation");
sit5.setDescription("Service exceeded SLA");
sits.add(sit5);
ServiceGraph graph=
ServiceDependencyBuilder.buildGraph(sds, sits);
if (graph == null) {
fail("Graph is null");
}
graph.setDescription("Graph description");
ServiceGraphLayoutImpl layout=new ServiceGraphLayoutImpl();
layout.layout(graph);
// Check some of the dimensions
SVGServiceGraphGenerator generator=new SVGServiceGraphGenerator();
java.io.ByteArrayOutputStream os=new java.io.ByteArrayOutputStream();
try {
generator.generate(graph, 0, os);
} catch (Exception e) {
e.printStackTrace();
fail("Failed to generate: "+e);
}
try {
os.close();
} catch (Exception e) {
fail("Failed to close: "+e);
}
String svg=new String(os.toByteArray());
if (!svg.contains("<svg")) {
fail("Not a SVG document");
}
System.out.println("LAYOUT GRAPH:\r\n"+svg);
}
@Test
public void testEmptyServiceDescriptionLayoutGraph() {
java.util.Set<ServiceDefinition> sds=new java.util.HashSet<ServiceDefinition>();
java.util.List<Situation> sits=new java.util.ArrayList<Situation>();
ServiceGraph graph=
ServiceDependencyBuilder.buildGraph(sds, sits);
if (graph == null) {
fail("Graph is null");
}
graph.setDescription("Graph description");
ServiceGraphLayoutImpl layout=new ServiceGraphLayoutImpl();
layout.layout(graph);
// Check some of the dimensions
SVGServiceGraphGenerator generator=new SVGServiceGraphGenerator();
java.io.ByteArrayOutputStream os=new java.io.ByteArrayOutputStream();
try {
generator.generate(graph, 0, os);
} catch (Exception e) {
fail("Failed to generate: "+e);
}
try {
os.close();
} catch (Exception e) {
fail("Failed to close: "+e);
}
String svg=new String(os.toByteArray());
if (!svg.contains("<svg")) {
fail("Not a SVG document");
}
System.out.println("EMPTY:\r\n"+svg);
}
@Test
public void testAverageSeverity() {
Severity[] severities={ Severity.Normal, Severity.Critical };
Severity avg=SVGServiceGraphGenerator.getAverageSeverity(severities);
if (avg == null) {
fail("Average is null");
}
if (avg != Severity.Warning) {
fail("Average should be Warning: "+avg);
}
}
@Test
public void testMultiCastExample() {
try {
java.io.InputStream is=SVGServiceGraphGeneratorTest.class.getResourceAsStream("/activities/multicast.json");
byte[] b=new byte[is.available()];
is.read(b);
ActivityUnit actUnit=ActivityUtil.deserializeActivityUnit(b);
java.util.Collection<ServiceDefinition> sds=ServiceDefinitionUtil.derive(actUnit);
java.util.Set<ServiceDefinition> defns=new java.util.HashSet<ServiceDefinition>(sds);
ServiceGraph graph=ServiceDependencyBuilder.buildGraph(defns, Collections.<Situation> emptyList());
if (graph == null) {
fail("Graph is null");
}
java.util.Set<ServiceNode> nodes=graph.getServiceNodes();
if (nodes == null) {
fail("Nodes list is null");
}
if (nodes.size() != 3) {
fail("Should be 3 nodes: "+nodes.size());
}
ServiceNode initialNode=null;
java.util.Iterator<ServiceNode> iter=nodes.iterator();
while (iter.hasNext()) {
ServiceNode sn=iter.next();
if (sn.getProperties().get(ServiceNode.INITIAL_NODE) == Boolean.TRUE) {
if (initialNode != null) {
fail("Should only be a single initial node");
}
initialNode = sn;
}
}
ServiceGraphLayout layout=LayoutFactory.getServiceGraphLayout();
layout.layout(graph);
SVGServiceGraphGenerator generator=new SVGServiceGraphGenerator();
java.io.ByteArrayOutputStream os=new java.io.ByteArrayOutputStream();
generator.generate(graph, 0, os);
os.close();
String svg=new String(os.toByteArray());
if (!svg.contains("<svg")) {
fail("Not a SVG document");
}
System.out.println("MULTICAST:\r\n"+svg);
} catch (Exception e) {
e.printStackTrace();
fail("Failed to test multicast example: "+e);
}
}
}