/* * 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; 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.InvocationMetric; 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.InvocationLink; import org.overlord.rtgov.service.dependency.OperationNode; 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.UsageLink; import org.overlord.rtgov.service.dependency.layout.LayoutFactory; import org.overlord.rtgov.service.dependency.layout.ServiceGraphLayout; public class ServiceDependencyBuilderTest { 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"; private static final String FAULT2 = "fault2"; @Test public void testInitialServices() { ServiceDefinition sd1=new ServiceDefinition(); sd1.setServiceType(SERVICE_TYPE1); InterfaceDefinition idef1=new InterfaceDefinition(); sd1.getInterfaces().add(idef1); idef1.setInterface(INTERFACE1); OperationDefinition op1=new OperationDefinition(); idef1.getOperations().add(op1); RequestResponseDefinition rrd1=new RequestResponseDefinition(); op1.setRequestResponse(rrd1); InvocationDefinition id1=new InvocationDefinition(); id1.setInterface(INTERFACE3); rrd1.getInvocations().add(id1); ServiceDefinition sd2=new ServiceDefinition(); sd2.setServiceType(SERVICE_TYPE2); InterfaceDefinition idef2=new InterfaceDefinition(); sd2.getInterfaces().add(idef2); idef2.setInterface(INTERFACE2); OperationDefinition op2=new OperationDefinition(); idef2.getOperations().add(op2); RequestResponseDefinition rrd2=new RequestResponseDefinition(); op2.setRequestResponse(rrd2); InvocationDefinition id2=new InvocationDefinition(); id2.setInterface(INTERFACE3); rrd2.getInvocations().add(id2); ServiceDefinition sd3=new ServiceDefinition(); sd3.setServiceType(SERVICE_TYPE3); InterfaceDefinition idef3=new InterfaceDefinition(); sd3.getInterfaces().add(idef3); idef3.setInterface(INTERFACE3); java.util.Set<ServiceDefinition> sds=new java.util.HashSet<ServiceDefinition>(); sds.add(sd1); sds.add(sd2); sds.add(sd3); java.util.Set<ServiceDefinition> results= ServiceDependencyBuilder.getInitialServices(sds); if (results == null) { fail("Results null"); } if (results.size() != 2) { fail("Should be 2 results: "+results.size()); } if (!results.contains(sd1)) { fail("SD1 not in results"); } if (!results.contains(sd2)) { fail("SD2 not in results"); } } @Test public void testServiceClients() { ServiceDefinition sd1=new ServiceDefinition(); sd1.setServiceType(SERVICE_TYPE1); InterfaceDefinition idef1=new InterfaceDefinition(); sd1.getInterfaces().add(idef1); idef1.setInterface(INTERFACE1); OperationDefinition op1=new OperationDefinition(); idef1.getOperations().add(op1); RequestResponseDefinition rrd1=new RequestResponseDefinition(); op1.setRequestResponse(rrd1); InvocationDefinition id1=new InvocationDefinition(); id1.setInterface(INTERFACE3); rrd1.getInvocations().add(id1); ServiceDefinition sd2=new ServiceDefinition(); sd2.setServiceType(SERVICE_TYPE2); InterfaceDefinition idef2=new InterfaceDefinition(); sd2.getInterfaces().add(idef2); idef2.setInterface(INTERFACE2); OperationDefinition op2=new OperationDefinition(); idef2.getOperations().add(op2); RequestFaultDefinition rrd2=new RequestFaultDefinition(); op2.getRequestFaults().add(rrd2); InvocationDefinition id2=new InvocationDefinition(); id2.setInterface(INTERFACE3); rrd2.getInvocations().add(id2); ServiceDefinition sd3=new ServiceDefinition(); sd3.setServiceType(SERVICE_TYPE3); InterfaceDefinition idef3=new InterfaceDefinition(); sd3.getInterfaces().add(idef3); idef3.setInterface(INTERFACE3); java.util.Set<ServiceDefinition> sds=new java.util.HashSet<ServiceDefinition>(); sds.add(sd1); sds.add(sd2); sds.add(sd3); java.util.Set<ServiceDefinition> results= ServiceDependencyBuilder.getServiceClients(sd3, sds); if (results == null) { fail("Results null"); } if (results.size() != 2) { fail("Should be 2 results: "+results.size()); } if (!results.contains(sd1)) { fail("SD1 not in results"); } if (!results.contains(sd2)) { fail("SD2 not in results"); } } @Test public void testBuildGraph() { ServiceDefinition sd1=new ServiceDefinition(); sd1.setServiceType(SERVICE_TYPE1); InterfaceDefinition idef1=new InterfaceDefinition(); sd1.getInterfaces().add(idef1); idef1.setInterface(INTERFACE1); 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); ServiceDefinition sd2=new ServiceDefinition(); sd2.setServiceType(SERVICE_TYPE2); InterfaceDefinition idef2=new InterfaceDefinition(); sd2.getInterfaces().add(idef2); idef2.setInterface(INTERFACE2); OperationDefinition op2=new OperationDefinition(); op2.setName(OP2); idef2.getOperations().add(op2); RequestResponseDefinition rrd2=new RequestResponseDefinition(); op2.setRequestResponse(rrd2); InvocationDefinition id2a=new InvocationDefinition(); id2a.setInterface(INTERFACE1); id2a.setOperation(OP1); rrd2.getInvocations().add(id2a); InvocationDefinition id2c=new InvocationDefinition(); id2c.setInterface(INTERFACE3); id2c.setOperation(OP3); rrd2.getInvocations().add(id2c); RequestFaultDefinition rfd2=new RequestFaultDefinition(); op2.getRequestFaults().add(rfd2); InvocationDefinition id2b=new InvocationDefinition(); id2b.setInterface(INTERFACE3); id2b.setOperation(OP3); rfd2.getInvocations().add(id2b); ServiceDefinition sd3=new ServiceDefinition(); sd3.setServiceType(SERVICE_TYPE3); InterfaceDefinition idef3=new InterfaceDefinition(); sd3.getInterfaces().add(idef3); idef3.setInterface(INTERFACE3); OperationDefinition op3=new OperationDefinition(); op3.setName(OP3); idef3.getOperations().add(op3); java.util.Set<ServiceDefinition> sds=new java.util.HashSet<ServiceDefinition>(); sds.add(sd1); sds.add(sd2); sds.add(sd3); java.util.List<Situation> sits=new java.util.ArrayList<Situation>(); Situation sit1=new Situation(); sit1.setSeverity(Situation.Severity.Critical); sit1.setSubject(Situation.createSubject(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(Situation.createSubject(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(Situation.createSubject(SERVICE_TYPE2, OP2, FAULT2)); sit3.setType("SLA Violation"); sit3.setDescription("Service exceeded SLA"); sits.add(sit3); ServiceGraph result= ServiceDependencyBuilder.buildGraph(sds, sits); if (result == null) { fail("Result null"); } if (result.getServiceNodes().size() != 3) { fail("Expecting 3 nodes: "+result.getServiceNodes().size()); } // Should only be 3 links, although 4 invocations, as // two are between the same source/target operation nodes if (result.getUsageLinks().size() != 3) { fail("Expecting 3 usage links: "+result.getUsageLinks().size()); } // Should only be 3 links, although 4 invocations, as // two are between the same source/target operation nodes if (result.getInvocationLinks().size() != 3) { fail("Expecting 3 invocation links: "+result.getInvocationLinks().size()); } ServiceNode sn1=result.getServiceNodeForInterface(INTERFACE1); OperationNode opn1=sn1.getOperation(OP1); ServiceNode sn2=result.getServiceNodeForInterface(INTERFACE2); OperationNode opn2=sn2.getOperation(OP2); ServiceNode sn3=result.getServiceNodeForInterface(INTERFACE3); OperationNode opn3=sn3.getOperation(OP3); if (result.getUsageLink(sn1, sn2) == null) { fail("UsageLink from s1 to s2 not present"); } if (result.getUsageLink(sn2, sn1) == null) { fail("UsageLink from s2 to s1 not present"); } if (result.getUsageLink(sn2, sn3) == null) { fail("UsageLink from s2 to s3 not present"); } if (result.getUsageLink(sn3, sn2) != null) { fail("UsageLink from s3 to s2 should not be present"); } int idcount=0; for (UsageLink ul : result.getUsageLinks()) { idcount += ul.getInvocations().size(); } if (idcount != 4) { fail("Expecting 4 invocation definitions: "+idcount); } if (result.getInvocationLink(opn1, opn2) == null) { fail("Link from op1 to op2 not present"); } if (result.getInvocationLink(opn2, opn1) == null) { fail("Link from op2 to op1 not present"); } if (result.getInvocationLink(opn2, opn3) == null) { fail("Link from op2 to op3 not present"); } if (result.getInvocationLink(opn3, opn2) != null) { fail("Link from op3 to op2 should not be present"); } idcount = 0; for (InvocationLink il : result.getInvocationLinks()) { idcount += il.getInvocations().size(); } if (idcount != 4) { fail("Expecting 4 invocation definitions: "+idcount); } if (sn1.getSituations().size() != 2) { fail("sn1 does not have 2 situation: "+sn1.getSituations().size()); } if (!sn1.getSituations().contains(sit1)) { fail("sn1 situation does not include sit1"); } if (!sn1.getSituations().contains(sit2)) { fail("sn1 situation does not include sit2"); } if (sn2.getSituations().size() != 0) { fail("sn2 should not have any situations: "+sn2.getSituations().size()); } if (opn2.getSituations().size() != 1) { fail("Opn2 does not have 1 situation: "+opn2.getSituations().size()); } if (opn2.getSituations().get(0) != sit3) { fail("Opn2 situation not sit3"); } } @Test public void testMergedMetrics() { InvocationDefinition id1=new InvocationDefinition(); InvocationDefinition id2=new InvocationDefinition(); InvocationMetric im1=id1.getMetrics(); im1.setCount(1); InvocationMetric im2=id2.getMetrics(); im2.setCount(2); java.util.List<InvocationDefinition> ids=new java.util.ArrayList<InvocationDefinition>(); ids.add(id1); ids.add(id2); InvocationMetric imresult=ServiceDependencyBuilder.getMergedMetrics(ids); if (imresult == null) { fail("No merged metric returned"); } if (imresult.getCount() != 3) { fail("Expecting count of 3: "+imresult.getCount()); } } @Test public void testMultiCastExample() { try { java.io.InputStream is=ServiceDependencyBuilderTest.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); iter = nodes.iterator(); while (iter.hasNext()) { ServiceNode sn=iter.next(); if (sn.getProperties().size() == 1) { fail("Service node '"+sn+"' does not have layout properties"); } } } catch (Exception e) { e.printStackTrace(); fail("Failed to test multicast example: "+e); } } protected ServiceGraph getServiceGraph() { ServiceDefinition sd1=new ServiceDefinition(); sd1.setServiceType(SERVICE_TYPE1); InterfaceDefinition idef1=new InterfaceDefinition(); sd1.getInterfaces().add(idef1); idef1.setInterface(INTERFACE1); 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); InvocationDefinition id4=new InvocationDefinition(); id4.setInterface(INTERFACE4); id4.setOperation(OP4); rrd1.getInvocations().add(id4); ServiceDefinition sd2=new ServiceDefinition(); sd2.setServiceType(SERVICE_TYPE2); InterfaceDefinition idef2=new InterfaceDefinition(); sd2.getInterfaces().add(idef2); idef2.setInterface(INTERFACE2); OperationDefinition op2=new OperationDefinition(); op2.setName(OP2); idef2.getOperations().add(op2); RequestResponseDefinition rrd2=new RequestResponseDefinition(); op2.setRequestResponse(rrd2); InvocationDefinition id2=new InvocationDefinition(); id2.setInterface(INTERFACE3); id2.setOperation(OP3); rrd2.getInvocations().add(id2); ServiceDefinition sd3=new ServiceDefinition(); sd3.setServiceType(SERVICE_TYPE3); InterfaceDefinition idef3=new InterfaceDefinition(); sd3.getInterfaces().add(idef3); idef3.setInterface(INTERFACE3); OperationDefinition op3=new OperationDefinition(); op3.setName(OP3); idef3.getOperations().add(op3); ServiceDefinition sd4=new ServiceDefinition(); sd4.setServiceType(SERVICE_TYPE4); InterfaceDefinition idef4=new InterfaceDefinition(); sd4.getInterfaces().add(idef4); idef4.setInterface(INTERFACE4); OperationDefinition op4=new OperationDefinition(); op4.setName(OP4); idef4.getOperations().add(op4); 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>(); ServiceGraph sg=ServiceDependencyBuilder.buildGraph(sds, sits); verifyFullServiceGraph(sg); return (sg); } protected void verifyFullServiceGraph(ServiceGraph sg) { if (sg == null) { fail("Result null"); } if (sg.getServiceNodes().size() != 4) { fail("Expecting 4 nodes: "+sg.getServiceNodes().size()); } if (sg.getUsageLinks().size() != 3) { fail("Expecting 3 usage links: "+sg.getUsageLinks().size()); } if (sg.getInvocationLinks().size() != 3) { fail("Expecting 3 invocation links: "+sg.getInvocationLinks().size()); } ServiceNode sn1=sg.getServiceNodeForInterface(INTERFACE1); OperationNode opn1=sn1.getOperation(OP1); ServiceNode sn2=sg.getServiceNodeForInterface(INTERFACE2); OperationNode opn2=sn2.getOperation(OP2); ServiceNode sn3=sg.getServiceNodeForInterface(INTERFACE3); OperationNode opn3=sn3.getOperation(OP3); ServiceNode sn4=sg.getServiceNodeForInterface(INTERFACE4); OperationNode opn4=sn4.getOperation(OP4); if (sg.getUsageLink(sn1, sn2) == null) { fail("UsageLink from s1 to s2 not present"); } if (sg.getUsageLink(sn2, sn3) == null) { fail("UsageLink from s2 to s3 not present"); } if (sg.getUsageLink(sn1, sn4) == null) { fail("UsageLink from s1 to s4 not present"); } if (sg.getInvocationLink(opn1, opn2) == null) { fail("Link from op1 to op2 not present"); } if (sg.getInvocationLink(opn1, opn4) == null) { fail("Link from op1 to op4 not present"); } if (sg.getInvocationLink(opn2, opn3) == null) { fail("Link from op2 to op3 not present"); } } @Test public void testFilterGraphFocusSN1() { ServiceGraph sg=getServiceGraph(); // Filtering on service type 1 should not change anything ServiceDependencyBuilder.filter(sg, SERVICE_TYPE1); // Check to see that the service graph has not changed verifyFullServiceGraph(sg); } @Test public void testFilterGraphFocusSN2() { ServiceGraph sg=getServiceGraph(); // Filtering on service type 2 should remove service type 4 ServiceDependencyBuilder.filter(sg, SERVICE_TYPE2); if (sg == null) { fail("Result null"); } if (sg.getServiceNodes().size() != 3) { fail("Expecting 3 nodes: "+sg.getServiceNodes().size()); } if (sg.getUsageLinks().size() != 2) { fail("Expecting 2 usage links: "+sg.getUsageLinks().size()); } if (sg.getInvocationLinks().size() != 2) { fail("Expecting 2 invocation links: "+sg.getInvocationLinks().size()); } ServiceNode sn1=sg.getServiceNodeForInterface(INTERFACE1); OperationNode opn1=sn1.getOperation(OP1); ServiceNode sn2=sg.getServiceNodeForInterface(INTERFACE2); OperationNode opn2=sn2.getOperation(OP2); ServiceNode sn3=sg.getServiceNodeForInterface(INTERFACE3); OperationNode opn3=sn3.getOperation(OP3); ServiceNode sn4=sg.getServiceNodeForInterface(INTERFACE4); if (sg.getUsageLink(sn1, sn2) == null) { fail("UsageLink from s1 to s2 not present"); } if (sg.getUsageLink(sn2, sn3) == null) { fail("UsageLink from s2 to s3 not present"); } if (sg.getInvocationLink(opn1, opn2) == null) { fail("Link from op1 to op2 not present"); } if (sg.getInvocationLink(opn2, opn3) == null) { fail("Link from op2 to op3 not present"); } if (sn4 != null) { fail("Service node with interface4 should not be present"); } } @Test public void testFilterGraphFocusSN3() { ServiceGraph sg=getServiceGraph(); // Filtering on service type 3 should remove service type 4 and 1 ServiceDependencyBuilder.filter(sg, SERVICE_TYPE3); if (sg == null) { fail("Result null"); } if (sg.getServiceNodes().size() != 2) { fail("Expecting 2 nodes: "+sg.getServiceNodes().size()); } if (sg.getUsageLinks().size() != 1) { fail("Expecting 1 usage links: "+sg.getUsageLinks().size()); } if (sg.getInvocationLinks().size() != 1) { fail("Expecting 1 invocation links: "+sg.getInvocationLinks().size()); } ServiceNode sn1=sg.getServiceNodeForInterface(INTERFACE1); ServiceNode sn2=sg.getServiceNodeForInterface(INTERFACE2); OperationNode opn2=sn2.getOperation(OP2); ServiceNode sn3=sg.getServiceNodeForInterface(INTERFACE3); OperationNode opn3=sn3.getOperation(OP3); ServiceNode sn4=sg.getServiceNodeForInterface(INTERFACE4); if (sg.getUsageLink(sn2, sn3) == null) { fail("UsageLink from s2 to s3 not present"); } if (sg.getInvocationLink(opn2, opn3) == null) { fail("Link from op2 to op3 not present"); } if (sn1 != null) { fail("Service node with interface1 should not be present"); } if (sn4 != null) { fail("Service node with interface4 should not be present"); } } }