Merge "WIP: JUnit Test - MapRequestUtilTest"
[lispflowmapping.git] / integrationtest / src / test / java / org / opendaylight / lispflowmapping / integrationtest / MultiSiteScenario.java
index 3942e13895aa9504b5926fc36055fb0d4841458f..f1472abfa9cc2b57bee2a23828a89e7372dadefc 100644 (file)
@@ -15,13 +15,17 @@ import static org.opendaylight.lispflowmapping.integrationtest.MappingServiceInt
 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_A;
 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D5;
 
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import org.apache.commons.lang3.ArrayUtils;
 import org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.Site;
 import org.opendaylight.lispflowmapping.interfaces.lisp.IFlowMapping;
 import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
+import org.opendaylight.lispflowmapping.lisp.serializer.MapRequestSerializer;
 import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
@@ -30,6 +34,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.addres
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapReply;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRequest;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItem;
@@ -43,6 +48,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.ma
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapregisternotification.MapRegisterBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRlocBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.SourceEid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.SourceEidBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequestBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
@@ -115,8 +121,9 @@ class MultiSiteScenario {
         return mappingRecord;
     }
 
-    private void emitMapRegisterMessage(final Site dstSite) {
+    private void emitMapRegisterMessage(final Site dstSite, final boolean merge) {
         final MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
+        mapRegisterBuilder.setMergeEnabled(merge);
         final MappingRecordItemBuilder mappingRecordItemBuilder = new MappingRecordItemBuilder();
         mappingRecordItemBuilder.setMappingRecordItemId(MAP_RECORD_A);
 
@@ -174,7 +181,8 @@ class MultiSiteScenario {
         mrbNegative.setEid(eidAsIpv4Prefix);
         mrbNegative.setAction(action);
 
-        mapService.addMapping(MappingOrigin.Northbound, eidAsIpv4Prefix, dstSite.getSiteId(), mrbNegative.build());
+        mapService.addMapping(MappingOrigin.Northbound, eidAsIpv4Prefix, dstSite.getSiteId(), mrbNegative.build(),
+                false);
     }
 
     void deleteNorthMappingNegative(final Site dstSite) {
@@ -187,16 +195,16 @@ class MultiSiteScenario {
     void storeNorthMappingSrcDst(final Site srcSite, final Site ... dstSite) {
         final MappingRecordBuilder mrb = prepareMappingRecord(EidType.EID_SRC_DST, srcSite,
                 dstSite);
-        mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build());
+        mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build(), false);
     }
 
     void storeNorthMappingIpPrefix(final Site... dstSite) {
         final MappingRecordBuilder mrb = prepareMappingRecord(EidType.EID_WITH_PREFIX, null, dstSite);
-        mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build());
+        mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build(), false);
     }
 
-    private void storeDestinationSiteMappingViaSouthbound(final Site dstSite) {
-        emitMapRegisterMessage(dstSite);
+    private void storeDestinationSiteMappingViaSouthbound(final Site dstSite, final boolean merge) {
+        emitMapRegisterMessage(dstSite, merge);
     }
 
     private MappingRecordBuilder prepareMappingRecordGeneral(final EidType eidType,
@@ -281,13 +289,13 @@ class MultiSiteScenario {
     }
 
     void deleteSouthboundMappings(final Site dstSite) {
-        emitMapRegisterMessage(dstSite);
+        emitMapRegisterMessage(dstSite, false);
 
     }
 
-    void storeSouthboundMappings(final Site ... sites) {
+    void storeSouthboundMappings(final boolean merge, final Site ... sites) {
         for (Site site : sites) {
-            storeDestinationSiteMappingViaSouthbound(site);
+            storeDestinationSiteMappingViaSouthbound(site, merge);
         }
     }
 
@@ -424,4 +432,56 @@ class MultiSiteScenario {
         }
     }
 
+
+    private List<MapRequest> translateBuffersToMapRequest(byte[][] buffers) {
+        final List<MapRequest> mapRequests = new ArrayList<>();
+        for (byte[] buffer : buffers) {
+            final MapRequest mapRequest = MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(buffer));
+            assertNotNull(mapRequest);
+            mapRequests.add(mapRequest);
+        }
+        return mapRequests;
+    }
+
+    private Set<Eid> prepareExpectedEid(final String ... hosts) {
+        final Set<Eid> eids = new HashSet<>();
+        for (String host : hosts) {
+            eids.add(LispAddressUtil.asIpv4PrefixBinaryEid(host + "/" + IP_MASK,
+                    new InstanceIdType(MultiSiteScenarioUtil.VNI2)));
+        }
+        return eids;
+    }
+
+    private SourceEid prepareSourceEid(final String eidPrefix) {
+        final SourceEidBuilder sourceEidBuilder = new SourceEidBuilder();
+        final Eid eid = LispAddressUtil.asIpv4Eid(eidPrefix, MultiSiteScenarioUtil.VNI2);
+        return sourceEidBuilder.setEid(eid).build();
+    }
+
+    void checkSMR(final SocketReader socketReader, final String site, final String ... hosts) {
+        List<MapRequest> mapRequests = translateBuffersToMapRequest(socketReader.getBuffers(hosts.length));
+        final Set<Eid> eids = prepareExpectedEid(hosts);
+        final SourceEid expectedSourceEid = prepareSourceEid(site);
+        for(MapRequest mapRequest : mapRequests) {
+            assertTrue(mapRequest.isSmr());
+            final SourceEid receivedSourceEid = mapRequest.getSourceEid();
+            assertEquals(expectedSourceEid, receivedSourceEid);
+            final List<EidItem> currentEidItems = mapRequest.getEidItem();
+            assertNotNull(currentEidItems);
+            assertTrue(SMRContainsExpectedEid(eids, currentEidItems));
+        }
+        //all expected eids should be after looping via mapRequests matched.
+        assertTrue("Expected eids wasn't/weren't found " + eids, eids.isEmpty());
+    }
+
+    private boolean SMRContainsExpectedEid(Set<Eid> eids, List<EidItem> currentEidItems) {
+        for (EidItem eidItem : currentEidItems) {
+            //if eid from map request is matched then it is removed from set of expected eids
+            if (!eids.remove(eidItem.getEid())) {
+                fail("SMR contained " + eidItem.getEid() + " which wasn't expected.");
+            }
+        }
+        return true;
+    }
+
 }