Enhancement of SMR test 37/37537/6
authorJozef Gloncak <jgloncak@cisco.com>
Wed, 13 Apr 2016 11:29:50 +0000 (13:29 +0200)
committerJozef Gloncak <jgloncak@cisco.com>
Fri, 15 Apr 2016 06:45:53 +0000 (08:45 +0200)
Socket reading is run in standalone thread. Class which is
responsible for reading socket content store every received
packet to standalone array. Whenever during existence of
instance of class SocketReader it is possible to read all of
received packets (SMRs).

Change-Id: I44be22ba0579f0c9f1ef49f154403e721faad121
Signed-off-by: Jozef Gloncak <jgloncak@cisco.com>
integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MappingServiceIntegrationTest.java
integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MultiSiteScenario.java
integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MultiSiteScenarioUtil.java
integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/SocketReader.java [new file with mode: 0644]
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/LispAddressUtil.java

index 4554d2559b379d90719164f66f41da03a23e0565..3fae288c2c7f1568c0a939cc32c984fc8fecd8ae 100644 (file)
@@ -405,7 +405,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
 
 
     /**
-     * Test scenario A
+     * TEST SCENARIO A
      */
     @Test
     public void testMultiSiteScenarioA() throws IOException {
@@ -414,7 +414,10 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
         final MultiSiteScenario multiSiteScenario = new MultiSiteScenario(mapService, lms);
         multiSiteScenario.setCommonAuthentication();
 
-        //test case 1
+        restartSocket();
+        final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket);
+
+        //TEST CASE 1
         multiSiteScenario.storeSouthboundMappings(SITE_A, SITE_B, SITE_C, SITE_D4, SITE_D5);
         multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
         multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
@@ -423,80 +426,126 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
         multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
         multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
 
-        //test case 2
+        //TEST CASE 2
+        //following action should trigger generatting of SMR messages:
+        // 1) 192.0.2.5/32
+        // 2) 192.0.1.1/32
         multiSiteScenario.storeNorthMappingSrcDst(SITE_A, SITE_C);
         sleepForSeconds(2);
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1));
         multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_C, 4);
         multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
         multiSiteScenario.assertPingFails(SITE_D4, 5, SITE_C, 4);
 
-        //test case 3
-        resetSocketAndCheckIsEmpty();
+        //TEST CASE 3
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.2.5/32
+        // 2) 192.0.1.1/32
+        // 3) 192.0.1.5/32
+        // 4) 192.0.4.5/32
         multiSiteScenario.deleteNorthMappingNegative(SITE_C);
         sleepForSeconds(2);
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1), SITE_A
+                        .getHost(5),
+                SITE_D4.getHost(5));
         multiSiteScenario.assertPingWorks(SITE_D4, 5, SITE_C, 4);
 
-        //test case 4
-        resetSocketAndCheckIsEmpty();
+        //TEST CASE 4
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.4.5/32
         multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C_RLOC_10);
         sleepForSeconds(2);
-        checkSmrPacketIsGenerated();
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5));
         //way of testing ping - get RLOC for mapping src-dst and compare it with awaited value doesn't test
         //that ping won't be successfull
         multiSiteScenario.assertPingFails(SITE_B, 5, SITE_C, 4);
 
-        //test case 5
-        resetSocketAndCheckIsEmpty();
+        //TEST CASE 5
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.4.5/32
+        // 2) 192.0.2.5/32
         multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
         sleepForSeconds(2);
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5), SITE_B.getHost(5));
         multiSiteScenario.assertPingFails(SITE_D4, 5, SITE_C, 4);
 
-        //test case 6
+        //TEST CASE 6
         multiSiteScenario.assertPingFails(SITE_D5, 5, SITE_C, 3);
 
-        //test case 7
-        resetSocketAndCheckIsEmpty();
+        //TEST CASE 7
         multiSiteScenario.deleteNorthMapingSrcDst(SITE_A, SITE_C);
+        sleepForSeconds(2);
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.4.5/32
+        // 2) 192.0.2.5/32
+        // 3) 192.0.5.5/32
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
+                SITE_B.getHost(5));
+
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.4.5/32
+        // 2) 192.0.2.5/32
+        // 3) 192.0.5.5/32
         multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
         sleepForSeconds(2);
-        checkSmrPacketIsGenerated();
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
+                SITE_B.getHost(5));
+
         multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
         multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
         multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
 
-        //test case 8
-        resetSocketAndCheckIsEmpty();
+        //TEST CASE 8
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.4.5/32
+        // 2) 192.0.2.5/32
+        // 3) 192.0.5.5/32
+        // 4) 192.0.1.1/32
         multiSiteScenario.deleteNorthMapingSrcDst(SITE_B, SITE_C);
         sleepForSeconds(2);
-        checkSmrPacketIsGenerated();
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
+                SITE_B.getHost(5),
+                SITE_A.getHost(1));
         multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
         multiSiteScenario.assertPingFails(SITE_B, 5, SITE_C, 4);
         multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
 
-        //test case 9
-        resetSocketAndCheckIsEmpty();
+        //TEST CASE 9
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.4.5/32
+        // 2) 192.0.2.5/32
+        // 3) 192.0.5.5/32
+        // 4) 192.0.1.1/32
         multiSiteScenario.deleteNorthMappingNegative(SITE_C);
         sleepForSeconds(2);
-        checkSmrPacketIsGenerated();
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
+                SITE_B.getHost(5),
+                SITE_A.getHost(1));
         multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
         multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
         multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_C, 4);
+
+        socketReader.stopReading();
+
     }
 
     /**
-     * Test scenario B
+     * TEST SCENARIO B
      */
     @Test
-    public void testMultiSiteScenarioB() {
+    public void testMultiSiteScenarioB() throws IOException {
         cleanUP();
 
         final MultiSiteScenario multiSiteScenario = new MultiSiteScenario(mapService, lms);
         multiSiteScenario.setCommonAuthentication();
 
+        restartSocket();
+        final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket);
+
         mapService.setLookupPolicy(ConfigIni.NB_AND_SB);
         mapService.setMappingOverwrite(false);
 
-        //test case 1
+        //TEST CASE 1
         multiSiteScenario.storeSouthboundMappings(SITE_A_SB, SITE_B_SB, SITE_C_WP_100_1_SB, SITE_D_WP_100_1_SB,
                 SITE_E_SB);
         multiSiteScenario.storeNorthMappingIpPrefix(SITE_A_SB);
@@ -506,56 +555,67 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
         multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
         multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
 
-        //test case 2
+        //TEST CASE 2
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.2.5/32
+        // 2) 192.0.1.5/32
         multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
+        sleepForSeconds(2);
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
+
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.2.5/32
+        // 2) 192.0.1.5/32
         multiSiteScenario.storeNorthMappingNegative(SITE_C_SB, Action.Drop);
         sleepForSeconds(2);
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
+
         multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
         multiSiteScenario.assertPingFails(SITE_B_SB, 5, SITE_C_SB, 4);
 
 
-        //test case 3
+        //TEST CASE 3
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.2.5/32
+        // 2) 192.0.1.5/32
         multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB);
         sleepForSeconds(2);
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
         multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4);
 
-        //test case 4
+        //TEST CASE 4
         multiSiteScenario.storeNorthMappingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
         sleepForSeconds(2);
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.2.5/32
+        // 2) 192.0.1.5/32
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
         multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
 
-        //test case 5
+        //TEST CASE 5
         multiSiteScenario.deleteSouthboundMappings(SITE_D_DELETE_SB);
         sleepForSeconds(2);
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.2.5/32
+        // 2) 192.0.1.5/32
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
+
         multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4);
 
-        //test case 6
+        //TEST CASE 6
         multiSiteScenario.deleteNorthMapingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB);
+        sleepForSeconds(2);
+        // following action should trigger generatting of SMR messages:
+        // 1) 192.0.2.5/32
+        // 2) 192.0.1.5/32
+        multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
+
         multiSiteScenario.deleteNorthMapingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB);
         sleepForSeconds(2);
         multiSiteScenario.assertPingFails(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4);
 
-    }
-
-    // ------------------------------- Simple Tests ---------------------------
+        socketReader.stopReading();
 
-    private void checkSmrPacketIsGenerated() {
-        byte[] data4 = receivePacketAndGetData();
-        assertNotNull(data4);
-        MapRequest deserializedMapRequest = MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(data4));
-        assertTrue(deserializedMapRequest.isSmr());
-    }
-
-    private void resetSocketAndCheckIsEmpty() {
-        restartSocket();
-        DatagramPacket datagramPacket;
-        boolean emptySocket = false;
-        try {
-            datagramPacket = receivePacket();
-        } catch (SocketTimeoutException e) {
-            emptySocket = true;
-        }
-        assertTrue(emptySocket);
     }
 
     // ------------------------------- Simple Tests ---------------------------
@@ -2050,15 +2110,6 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
         }
     }
 
-    private byte[] receivePacketAndGetData() {
-        try {
-            final DatagramPacket datagramPacket = receivePacket();
-            return datagramPacket.getData();
-        } catch (SocketTimeoutException e) {
-            return null;
-        }
-    }
-
     private DatagramPacket receivePacket() throws SocketTimeoutException {
         return receivePacket(6000);
     }
index 3942e13895aa9504b5926fc36055fb0d4841458f..42097f6937e0b6510dbe951e899c018cb60cd912 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;
@@ -424,4 +430,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.asIpv4PrefixEid(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;
+    }
+
 }
index f5068a1bed56dfa73aa8a7958500c7df3c39c805..81c921321b861b185899dea873c7036c3e250054 100644 (file)
@@ -19,7 +19,7 @@ class MultiSiteScenarioUtil {
     private final static String HOST4 = ".4";
     private final static String HOST5 = ".5";
 
-    private final static long VNI2 = 2L;
+    protected final static long VNI2 = 2L;
     private final static long VNI3 = 3L;
 
     static final Short DEFAULT_PRIORITY = 1;
diff --git a/integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/SocketReader.java b/integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/SocketReader.java
new file mode 100644 (file)
index 0000000..ac4924b
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.lispflowmapping.integrationtest;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.SocketTimeoutException;
+import java.util.Arrays;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Read data from specified socket in standalone thread. Packets are stored to array of buffer. In other words each
+ * packet is stored in standalone buffer. So whenever during existence of instance of this class it is possible to
+ * access red packets.
+ */
+public class SocketReader implements Runnable {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SocketReader.class);
+    /**
+     * max number of packets which can be stored to this to buffer
+     */
+    private static final int MAX_NUMBER_OF_PACKETS_TO_STORE = 100;
+    private final DatagramSocket socket;
+
+    /**
+     * array of buffers where SMR messages are stored
+     */
+    private byte[][] buffers = new byte[MAX_NUMBER_OF_PACKETS_TO_STORE][4096];
+
+    /**
+     * Index to array of buffers where current writting is done
+     */
+    private int currentBufferWriteIndex = 0;
+
+    /**
+     * Index to array of buffers from where current reading is done
+     */
+    private int currentBufferReaderIndex = 0;
+    private DatagramPacket receivePacket;
+    private boolean readFromSocket = true;
+
+    private SocketReader(DatagramSocket receivedSocket) {
+        this.socket = receivedSocket;
+    }
+
+    static SocketReader startReadingInStandaloneThread(final DatagramSocket socket) throws SocketTimeoutException {
+        try {
+            socket.setSoTimeout(0);
+            final SocketReader socketReader = new SocketReader(socket);
+            final Thread thread = new Thread(socketReader);
+            thread.setName("Socket reader - multisite integration test - lispflowmapping");
+            thread.start();
+            return socketReader;
+        } catch (Throwable t) {
+            fail();
+            return null;
+        }
+    }
+
+    @Override
+    public void run() {
+        while (readFromSocket && currentBufferReaderIndex < MAX_NUMBER_OF_PACKETS_TO_STORE) {
+            receivePacket = new DatagramPacket(buffers[currentBufferWriteIndex], buffers[currentBufferWriteIndex].
+                    length);
+            try {
+                socket.receive(receivePacket);
+            } catch (IOException e) {
+                LOG.debug("Problem while reading SMR test socket.", e);
+            }
+            currentBufferWriteIndex++;
+        }
+    }
+
+    void stopReading() {
+        readFromSocket = false;
+        socket.close();
+    }
+
+    /**
+     * Read from buffers {@code count} number of buffers from current postion.
+     *
+     * @param count how many buffer should be returned.
+     * @return array of buffers
+     */
+    byte[][] getBuffers(final int count) {
+        final byte[][] subBuffer = Arrays.copyOfRange(buffers, currentBufferReaderIndex, currentBufferReaderIndex +
+                count);
+        currentBufferReaderIndex = currentBufferReaderIndex + count;
+        return subBuffer;
+    }
+
+}
index 5f4fbff4058c9cebce8c38a3079dd41bea54484d..1fe1e0c2d5b158023a10927ab3d57448ba45336c 100644 (file)
@@ -308,6 +308,10 @@ public final class LispAddressUtil {
         return toEid(new Ipv4Prefix(prefix), null);
     }
 
+    public static Eid asIpv4PrefixEid(final String prefix, final InstanceIdType iiType) {
+        return toEid(new Ipv4Prefix(prefix), iiType);
+    }
+
     public static Eid asIpv4Eid(String address) {
         return toEid(new Ipv4Address(address), null);
     }