/**
- * Test scenario A
+ * TEST SCENARIO A
*/
@Test
public void testMultiSiteScenarioA() throws IOException {
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);
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);
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 ---------------------------
}
}
- private byte[] receivePacketAndGetData() {
- try {
- final DatagramPacket datagramPacket = receivePacket();
- return datagramPacket.getData();
- } catch (SocketTimeoutException e) {
- return null;
- }
- }
-
private DatagramPacket receivePacket() throws SocketTimeoutException {
return receivePacket(6000);
}
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;
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;
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;
}
}
+
+ 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;
+ }
+
}
--- /dev/null
+/*
+ * 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;
+ }
+
+}