Bug 5047: Improve soutbound performance
[lispflowmapping.git] / mappingservice / southbound / src / test / java / org / opendaylight / lispflowmapping / southbound / lisp / LispSouthboundServiceTest.java
index f0d1aaf967ad550f955ea7f008e60433c2516369..2e557b527f0a1035b39030ef210c67340be854a0 100644 (file)
@@ -8,59 +8,62 @@
 
 package org.opendaylight.lispflowmapping.southbound.lisp;
 
+import static io.netty.buffer.Unpooled.wrappedBuffer;
+import io.netty.channel.socket.DatagramPacket;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import java.net.DatagramPacket;
+import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
 import junitx.framework.ArrayAssert;
-import junitx.framework.Assert;
 
 import org.apache.commons.lang3.ArrayUtils;
 import org.jmock.api.Invocation;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
-import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
-import org.opendaylight.lispflowmapping.lisp.type.AddressFamilyNumberEnum;
+import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
 import org.opendaylight.lispflowmapping.lisp.type.LispMessage;
-import org.opendaylight.lispflowmapping.lisp.type.LispMessageEnum;
 import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
-import org.opendaylight.lispflowmapping.lisp.util.LispAFIConvertor;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
 import org.opendaylight.lispflowmapping.lisp.util.MapNotifyBuilderHelper;
+import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
 import org.opendaylight.lispflowmapping.lisp.serializer.MapNotifySerializer;
 import org.opendaylight.lispflowmapping.lisp.serializer.MapReplySerializer;
 import org.opendaylight.lispflowmapping.southbound.lisp.exception.LispMalformedPacketException;
 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.AddMapping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.EidToLocatorRecord.Action;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.LispAFIAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.MapRegister;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.MapRequest;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.RequestMapping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.eidrecords.EidRecord;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.eidtolocatorrecords.EidToLocatorRecord;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.eidtolocatorrecords.EidToLocatorRecordBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.LispAddressContainer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.ipv4.Ipv4AddressBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.ipv6.Ipv6AddressBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.locatorrecords.LocatorRecord;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.locatorrecords.LocatorRecordBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.mapnotifymessage.MapNotifyBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.mapreplymessage.MapReplyBuilder;
-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.inet.types.rev100924.Ipv6Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.afn.safi.rev130704.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.AddMapping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRegister;
+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.MessageType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.RequestMapping;
+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.locatorrecords.LocatorRecord;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapnotifymessage.MapNotifyBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapreplymessage.MapReplyBuilder;
 import org.opendaylight.yangtools.yang.binding.Notification;
 
 public class LispSouthboundServiceTest extends BaseTestCase {
 
-    private LispSouthboundService testedLispService;
-    private NotificationProviderService nps;
+    private LispSouthboundHandler testedLispService;
+    private NotificationPublishService nps;
     private byte[] mapRequestPacket;
     private byte[] mapRegisterPacket;
     private ValueSaverAction<Notification> lispNotificationSaver;
@@ -68,7 +71,7 @@ public class LispSouthboundServiceTest extends BaseTestCase {
     // private ValueSaverAction<MapRequest> mapRequestSaver;
     private MapNotifyBuilder mapNotifyBuilder;
     private MapReplyBuilder mapReplyBuilder;
-    private EidToLocatorRecordBuilder eidToLocatorBuilder;
+    private MappingRecordBuilder mappingRecordBuilder;
 
     private interface MapReplyIpv4SingleLocatorPos {
         int RECORD_COUNT = 3;
@@ -95,8 +98,8 @@ public class LispSouthboundServiceTest extends BaseTestCase {
         super.before();
         // mapResolver = context.mock(IMapResolver.class);
         // mapServer = context.mock(IMapServer.class);
-        testedLispService = new LispSouthboundService();
-        nps = context.mock(NotificationProviderService.class);
+        testedLispService = new LispSouthboundHandler(null);
+        nps = context.mock(NotificationPublishService.class);
         testedLispService.setNotificationProvider(nps);
         lispNotificationSaver = new ValueSaverAction<Notification>();
         // mapRegisterSaver = new ValueSaverAction<MapRegister>();
@@ -121,20 +124,20 @@ public class LispSouthboundServiceTest extends BaseTestCase {
                 + "0050   2a cd 39 c8 d6 08 00 01 01 02 03 04 00 01 c0 a8 88 0a 00 20 " //
                 + "0060   00 01 01 02 03 04"));
         mapReplyBuilder = new MapReplyBuilder();
-        mapReplyBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
+        mapReplyBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
         mapReplyBuilder.setNonce((long) 0);
         mapReplyBuilder.setEchoNonceEnabled(false);
         mapReplyBuilder.setProbe(true);
         mapReplyBuilder.setSecurityEnabled(true);
-        eidToLocatorBuilder = new EidToLocatorRecordBuilder();
+        mappingRecordBuilder = new MappingRecordBuilder();
         String ip = "0.0.0.0";
-        eidToLocatorBuilder.setLispAddressContainer(getIPContainer(ip));
-        eidToLocatorBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
-        eidToLocatorBuilder.setRecordTtl(10);
-        eidToLocatorBuilder.setMapVersion((short) 0);
-        eidToLocatorBuilder.setMaskLength((short) 0);
-        eidToLocatorBuilder.setAction(Action.NativelyForward);
-        eidToLocatorBuilder.setAuthoritative(false);
+        mappingRecordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid(ip + "/0"));
+        mappingRecordBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
+        mappingRecordBuilder.setRecordTtl(10);
+        mappingRecordBuilder.setMapVersion((short) 0);
+        mappingRecordBuilder.setMaskLength((short) 0);
+        mappingRecordBuilder.setAction(Action.NativelyForward);
+        mappingRecordBuilder.setAuthoritative(false);
         // eidToLocatorBuilder.setPrefix(new LispIpv4Address(0));
         // mapReply.addEidToLocator(eidToLocatorBuilder);
 
@@ -164,18 +167,6 @@ public class LispSouthboundServiceTest extends BaseTestCase {
         mapNotifyBuilder.setAuthenticationData(new byte[0]);
     }
 
-    private LispAddressContainer getIPContainer(String ip) {
-        return LispAFIConvertor.toContainer(getIP(ip));
-    }
-
-    private org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.ipv4.Ipv4Address getIP(String ip) {
-        return new Ipv4AddressBuilder().setIpv4Address(new Ipv4Address(ip)).setAfi((short) 1).build();
-    }
-
-    private org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.ipv6.Ipv6Address getIPV6(String ip) {
-        return new Ipv6AddressBuilder().setIpv6Address(new Ipv6Address(ip)).setAfi((short) 2).build();
-    }
-
     @Test
     @Ignore
     public void todos() throws Exception {
@@ -239,16 +230,16 @@ public class LispSouthboundServiceTest extends BaseTestCase {
                 + "0060   ff 00 00 05 00 01 0a 01 00 6e 06 64 ff 00 00 05 " //
                 + "0070   00 01 c0 a8 88 33"));
 
-        oneOf(nps).publish(with(lispNotificationSaver));
+        oneOf(nps).putNotification(with(lispNotificationSaver));
 
         handleMapRegisterPacket(mapRegisterPacket);
 
-        List<EidToLocatorRecord> eidRecords = lastMapRegister().getEidToLocatorRecord();
+        List<MappingRecordItem> eidRecords = lastMapRegister().getMappingRecordItem();
         assertEquals(1, eidRecords.size());
-        EidToLocatorRecord eidRecord = eidRecords.get(0);
+        MappingRecord eidRecord = eidRecords.get(0).getMappingRecord();
         assertEquals(2, eidRecord.getLocatorRecord().size());
-        assertEquals(getIPContainer("10.1.0.110"), eidRecord.getLocatorRecord().get(0).getLispAddressContainer());
-        assertEquals(getIPContainer("192.168.136.51"), eidRecord.getLocatorRecord().get(1).getLispAddressContainer());
+        assertEquals(LispAddressUtil.asIpv4Rloc("10.1.0.110"), eidRecord.getLocatorRecord().get(0).getRloc());
+        assertEquals(LispAddressUtil.asIpv4Rloc("192.168.136.51"), eidRecord.getLocatorRecord().get(1).getRloc());
     }
 
     @Test
@@ -274,34 +265,34 @@ public class LispSouthboundServiceTest extends BaseTestCase {
                 + "0060   01 92 00 00 00 00 00 00 00 01 01 64 ff 00 00 05 " //
                 + "0070   00 01 0a 00 3a 9c"));
 
-        oneOf(nps).publish(with(lispNotificationSaver));
+        oneOf(nps).putNotification(with(lispNotificationSaver));
 
         handleMapRegisterPacket(mapRegisterPacket);
 
-        EidToLocatorRecord eidToLocatorRecord = lastMapRegister().getEidToLocatorRecord().get(0);
-        assertEquals(getIPV6("2610:d0:ffff:192:0:0:0:1"), LispAFIConvertor.toAFI(eidToLocatorRecord.getLispAddressContainer()));
-        assertEquals(AddressFamilyNumberEnum.IP6,
-                AddressFamilyNumberEnum.valueOf(LispAFIConvertor.toAFI(eidToLocatorRecord.getLispAddressContainer()).getAfi()));
+        MappingRecord eidToLocatorRecord = lastMapRegister().getMappingRecordItem().get(0).getMappingRecord();
+        assertEquals("2610:d0:ffff:192:0:0:0:1/128",
+                ((Ipv6Prefix) eidToLocatorRecord.getEid().getAddress()).getIpv6Prefix().getValue());
+        assertEquals(Ipv6PrefixAfi.class, eidToLocatorRecord.getEid().getAddressType());
 
-        assertEquals(getIP("10.0.58.156"), LispAFIConvertor.toAFI(eidToLocatorRecord.getLocatorRecord().get(0).getLispAddressContainer()));
+        assertEquals(LispAddressUtil.asIpv4Rloc("10.0.58.156"), eidToLocatorRecord.getLocatorRecord().get(0).getRloc());
     }
 
     @Test
     public void mapRegister__VerifyBasicFields() throws Exception {
-        oneOf(nps).publish(with(lispNotificationSaver));
+        oneOf(nps).putNotification(with(lispNotificationSaver));
         handleMapRegisterPacket(mapRegisterPacket);
 
-        EidToLocatorRecord eidToLocator = lastMapRegister().getEidToLocatorRecord().get(0);
-        assertEquals(getIP("153.16.254.1"), LispAFIConvertor.toAFI(eidToLocator.getLispAddressContainer()));
+        MappingRecord eidToLocator = lastMapRegister().getMappingRecordItem().get(0).getMappingRecord();
+        assertEquals(LispAddressUtil.asIpv4PrefixEid("153.16.254.1/32"), eidToLocator.getEid());
 
         assertEquals(1, eidToLocator.getLocatorRecord().size());
-        assertEquals(getIP("192.168.136.10"), LispAFIConvertor.toAFI(eidToLocator.getLocatorRecord().get(0).getLispAddressContainer()));
+        assertEquals(LispAddressUtil.asIpv4Rloc("192.168.136.10"), eidToLocator.getLocatorRecord().get(0).getRloc());
     }
 
     @Test
     @Ignore
     public void mapRegister__NoResponseFromMapServerShouldReturnNullPacket() throws Exception {
-        oneOf(nps).publish(with(lispNotificationSaver));
+        oneOf(nps).putNotification(with(lispNotificationSaver));
         mapNotifyBuilder = null;
 
         assertNull(handleMapRegisterPacket(mapRegisterPacket));
@@ -361,39 +352,39 @@ public class LispSouthboundServiceTest extends BaseTestCase {
         System.arraycopy(mapRegisterPacket, 0, extraDataPacket, 0, mapRegisterPacket.length);
         stubMapRegister(true);
 
-        DatagramPacket dp = new DatagramPacket(extraDataPacket, extraDataPacket.length);
-        dp.setLength(mapRegisterPacket.length);
+        DatagramPacket dp = new DatagramPacket(wrappedBuffer(extraDataPacket), new InetSocketAddress(0), new InetSocketAddress(0));
         testedLispService.handlePacket(dp);
         // Check map register fields.
         // XXX: test
         // byte[] notifyResult = testedLispService.handlePacket(dp).getData();
-        byte[] notifyResult = lastMapNotifyPacket().getData();
+        byte[] notifyResult = lastMapNotifyPacket().content().array();
         assertEquals(mapRegisterPacket.length, notifyResult.length);
 
     }
 
     private DatagramPacket lastMapReplyPacket() {
         ByteBuffer serialize = MapReplySerializer.getInstance().serialize(mapReplyBuilder.build());
-        return new DatagramPacket(serialize.array(), serialize.array().length);
+        return new DatagramPacket(wrappedBuffer(serialize), new InetSocketAddress(0), new InetSocketAddress(0));
     }
 
     private DatagramPacket lastMapNotifyPacket() {
-        if (mapNotifyBuilder.getEidToLocatorRecord() == null) {
-            mapNotifyBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
+        if (mapNotifyBuilder.getMappingRecordItem() == null) {
+            mapNotifyBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
         }
-        mapNotifyBuilder.getEidToLocatorRecord().add(eidToLocatorBuilder.build());
+        mapNotifyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(
+                mappingRecordBuilder.build()).build());
         mapNotifyBuilder.setNonce((long) 0);
         mapNotifyBuilder.setKeyId((short) 0);
         mapNotifyBuilder.setAuthenticationData(new byte[0]);
         ByteBuffer serialize = MapNotifySerializer.getInstance().serialize(mapNotifyBuilder.build());
-        return new DatagramPacket(serialize.array(), serialize.array().length);
+        return new DatagramPacket(wrappedBuffer(serialize), new InetSocketAddress(0), new InetSocketAddress(0));
     }
 
     @Test
     @Ignore
     public void mapNotify__VerifyBasicFields() throws Exception {
         byte registerType = mapRegisterPacket[0];
-        assertEquals(LispMessageEnum.MapRegister.getValue(), registerType >> 4);
+        assertEquals(MessageType.MapRegister.getIntValue(), registerType >> 4);
 
         stubMapRegister(true);
 
@@ -401,7 +392,7 @@ public class LispSouthboundServiceTest extends BaseTestCase {
 
         assertEquals(mapRegisterPacket.length, result.length);
 
-        byte expectedType = (byte) (LispMessageEnum.MapNotify.getValue() << 4);
+        byte expectedType = (byte) (MessageType.MapNotify.getIntValue() << 4);
         assertHexEquals(expectedType, result[0]);
         assertHexEquals((byte) 0x00, result[1]);
         assertHexEquals((byte) 0x00, result[2]);
@@ -419,23 +410,19 @@ public class LispSouthboundServiceTest extends BaseTestCase {
         stubMapRegister(true);
 
         DatagramPacket notifyPacket = handleMapRegisterPacket(mapRegisterPacket);
-        assertEquals(LispMessage.PORT_NUM, notifyPacket.getPort());
+        assertEquals(LispMessage.PORT_NUM, notifyPacket.recipient().getPort());
     }
 
     @Test
     public void mapRequest__VerifyBasicFields() throws Exception {
-        oneOf(nps).publish(with(lispNotificationSaver));
+        oneOf(nps).putNotification(with(lispNotificationSaver));
         handleMapRequestAsByteArray(mapRequestPacket);
-        List<EidRecord> eids = lastMapRequest().getEidRecord();
+        List<EidItem> eids = lastMapRequest().getEidItem();
         assertEquals(1, eids.size());
-        LispAFIAddress lispAddress = LispAFIConvertor.toAFI(eids.get(0).getLispAddressContainer());
-        assertTrue(lispAddress instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.ipv4.Ipv4Address);
-        assertEquals(getIP("1.2.3.4"), ((org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.ipv4.Ipv4Address) lispAddress));
-        assertEquals((byte) 0x20, eids.get(0).getMask().byteValue());
+        Eid lispAddress = eids.get(0).getEid();
+        assertEquals(Ipv4PrefixAfi.class, lispAddress.getAddressType());
+        assertEquals(LispAddressUtil.asIpv4PrefixEid("1.2.3.4/32"), lispAddress);
         assertEquals(0x3d8d2acd39c8d608L, lastMapRequest().getNonce().longValue());
-        // assertEquals(AddressFamilyNumberEnum.RESERVED,
-        // AddressFamilyNumberEnum.valueOf(LispAFIToContainerConvertorFactory.toAFI(
-        // lastMapRequest().getSourceEid().getLispAddressContainer()).getAfi()));
     }
 
     @Test
@@ -464,12 +451,12 @@ public class LispSouthboundServiceTest extends BaseTestCase {
                 + "00a0   00 02 26 10 00 d0 ff ff 01 92 00 00 00 00 00 00 " //
                 + "00b0   00 01 01 64 ff 00 00 05 00 01 0a 00 3a 9c"));
 
-        oneOf(nps).publish(with(lispNotificationSaver));
+        oneOf(nps).putNotification(with(lispNotificationSaver));
         // ret(mapReply);
 
         handleMapRequestAsByteArray(mapRequestPacket);
-        assertEquals(getIPV6("2610:d0:ffff:192:0:0:0:1"), LispAFIConvertor.toAFI(lastMapRequest().getSourceEid().getLispAddressContainer()));
-        assertEquals(getIPV6("2610:d0:ffff:192:0:0:0:2"), LispAFIConvertor.toAFI(lastMapRequest().getEidRecord().get(0).getLispAddressContainer()));
+        assertEquals(LispAddressUtil.asIpv6Eid("2610:d0:ffff:192:0:0:0:1"), lastMapRequest().getSourceEid().getEid());
+        assertEquals(LispAddressUtil.asIpv6PrefixEid("2610:d0:ffff:192:0:0:0:2/128"), lastMapRequest().getEidItem().get(0).getEid());
     }
 
     @Ignore
@@ -492,11 +479,11 @@ public class LispSouthboundServiceTest extends BaseTestCase {
                 + "0090   00 00 00 00 00 02 00 00 00 0a 01 80 10 00 00 00 " //
                 + "00a0   00 02 26 10 00 d0 ff ff 01 92 00 00 00 00 00 00 " //
                 + "00b0   00 01 01 64 ff 00 00 05 00 01 0a 00 3a 9c"));
-        oneOf(nps).publish(with(lispNotificationSaver));
+        oneOf(nps).putNotification(with(lispNotificationSaver));
         // ret(mapReply);
 
         DatagramPacket replyPacket = handleMapRequestPacket(mapRequestPacket);
-        assertEquals(4342, replyPacket.getPort());
+        assertEquals(4342, replyPacket.recipient().getPort());
     }
 
     @Test
@@ -514,18 +501,18 @@ public class LispSouthboundServiceTest extends BaseTestCase {
                 + "0070   10 00 00 00 00 01 99 10 fe 01 01 64 ff 00 00 05 " //
                 + "0080   00 01 0a 00 01 26"));
 
-        oneOf(nps).publish(with(lispNotificationSaver));
+        oneOf(nps).putNotification(with(lispNotificationSaver));
         // ret(mapReply);
 
         handleMapRequestAsByteArray(mapRequestPacket);
-        Assert.assertNotEquals(AddressFamilyNumberEnum.IP, LispAFIConvertor.toAFI(lastMapRequest().getSourceEid().getLispAddressContainer()));
+        assertEquals(Ipv4Afi.class, lastMapRequest().getSourceEid().getEid().getAddressType());
 
     }
 
     @Test
     @Ignore
     public void mapReply__VerifyBasicIPv4Fields() throws Exception {
-        eidToLocatorBuilder.setMaskLength((short) 0x20).setLispAddressContainer(LispAFIConvertor.toContainer(getIP("10.0.20.200")));
+        mappingRecordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("10.0.20.200/32"));
         mapReplyBuilder.setNonce(0x3d8d2acd39c8d608L);
 
         stubHandleRequest();
@@ -541,15 +528,15 @@ public class LispSouthboundServiceTest extends BaseTestCase {
         byte expectedRecordCount = (byte) 1;
         assertEquals(expectedRecordCount, result[MapReplyIpv4SingleLocatorPos.RECORD_COUNT]);
 
-        assertEquals(eidToLocatorBuilder.getMaskLength().byteValue(), result[MapReplyIpv4SingleLocatorPos.EID_MASK_LEN]);
-        assertEquals(AddressFamilyNumberEnum.IP.getIanaCode(), ByteUtil.getShort(result, MapReplyIpv4SingleLocatorPos.AFI_TYPE));
+        assertEquals(MaskUtil.getMaskForAddress(mappingRecordBuilder.getEid().getAddress()), result[MapReplyIpv4SingleLocatorPos.EID_MASK_LEN]);
+        assertEquals(AddressFamily.IpV4.getIntValue(), ByteUtil.getInt(result, MapReplyIpv4SingleLocatorPos.AFI_TYPE));
         assertEquals(0x0a0014c8, ByteUtil.getInt(result, MapReplyIpv4SingleLocatorPos.EID_PREFIX));
     }
 
     @Test
     @Ignore
     public void mapReply__VerifyBasicIPv6() throws Exception {
-        eidToLocatorBuilder.setMaskLength((short) 0x80).setLispAddressContainer(LispAFIConvertor.toContainer(getIPV6("0:0:0:0:0:0:0:1")));
+        mappingRecordBuilder.setEid(LispAddressUtil.asIpv6PrefixEid("0:0:0:0:0:0:0:1/128"));
 
         stubHandleRequest();
 
@@ -560,8 +547,8 @@ public class LispSouthboundServiceTest extends BaseTestCase {
         byte expectedRecordCount = (byte) 1;
         assertEquals(expectedRecordCount, result[MapReplyIpv4SingleLocatorPos.RECORD_COUNT]);
 
-        assertEquals(eidToLocatorBuilder.getMaskLength().byteValue(), result[MapReplyIpv4SingleLocatorPos.EID_MASK_LEN]);
-        assertEquals(AddressFamilyNumberEnum.IP6.getIanaCode(), ByteUtil.getShort(result, MapReplyIpv4SingleLocatorPos.AFI_TYPE));
+        assertEquals(MaskUtil.getMaskForAddress(mappingRecordBuilder.getEid().getAddress()), result[MapReplyIpv4SingleLocatorPos.EID_MASK_LEN]);
+        assertEquals(AddressFamily.IpV6.getIntValue(), ByteUtil.getInt(result, MapReplyIpv4SingleLocatorPos.AFI_TYPE));
         byte[] expectedIpv6 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
 
         ArrayAssert.assertEquals(expectedIpv6, Arrays.copyOfRange(result, 24, 40));
@@ -570,9 +557,9 @@ public class LispSouthboundServiceTest extends BaseTestCase {
     @Test
     @Ignore
     public void mapReply__VerifyIPv6EidAndLocator() throws Exception {
-        eidToLocatorBuilder.setLispAddressContainer(LispAFIConvertor.toContainer(getIPV6("0:0:0:0:0:0:0:1")));
-        eidToLocatorBuilder.getLocatorRecord().add(
-                new LocatorRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(getIPV6("0:0:0:0:0:0:0:2"))).build());
+        mappingRecordBuilder.setEid(LispAddressUtil.asIpv6PrefixEid("0:0:0:0:0:0:0:1/128"));
+        mappingRecordBuilder.getLocatorRecord().add(
+                new LocatorRecordBuilder().setRloc(LispAddressUtil.asIpv6Rloc("0:0:0:0:0:0:0:2")).build());
 
         stubHandleRequest();
 
@@ -592,15 +579,15 @@ public class LispSouthboundServiceTest extends BaseTestCase {
     public void mapReply__UseEncapsulatedUdpPort() throws Exception {
         stubHandleRequest();
 
-        assertEquals(LispMessage.PORT_NUM, handleMapRequestPacket(mapRequestPacket).getPort());
+        assertEquals(LispMessage.PORT_NUM, handleMapRequestPacket(mapRequestPacket).recipient().getPort());
     }
 
     @Test
     @Ignore
     public void mapReply__WithNonRoutableSingleLocator() throws Exception {
-        eidToLocatorBuilder.setMaskLength((short) 0x20).setLispAddressContainer(LispAFIConvertor.toContainer(getIP("10.0.20.200")));
-        eidToLocatorBuilder.getLocatorRecord().add(
-                new LocatorRecordBuilder().setRouted(false).setLispAddressContainer(LispAFIConvertor.toContainer(getIP("4.3.2.1"))).build());
+        mappingRecordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("10.0.20.200/32"));
+        mappingRecordBuilder.getLocatorRecord().add(
+                new LocatorRecordBuilder().setRouted(false).setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1")).build());
         stubHandleRequest();
 
         byte[] result = handleMapRequestAsByteArray(mapRequestPacket);
@@ -610,10 +597,9 @@ public class LispSouthboundServiceTest extends BaseTestCase {
     @Test
     @Ignore
     public void mapReply__WithSingleLocator() throws Exception {
-        eidToLocatorBuilder.setMaskLength((short) 0x20)//
-                .setLispAddressContainer(LispAFIConvertor.toContainer(getIP("10.0.20.200")));
-        eidToLocatorBuilder.getLocatorRecord().add(
-                new LocatorRecordBuilder().setRouted(true).setLispAddressContainer(LispAFIConvertor.toContainer(getIP("4.3.2.1"))).build());
+        mappingRecordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("10.0.20.200/32"));
+        mappingRecordBuilder.getLocatorRecord().add(
+                new LocatorRecordBuilder().setRouted(true).setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1")).build());
         stubHandleRequest();
 
         byte[] result = handleMapRequestAsByteArray(mapRequestPacket);
@@ -622,7 +608,7 @@ public class LispSouthboundServiceTest extends BaseTestCase {
         byte expectedLocCount = 1;
         assertEquals(expectedLocCount, result[MapReplyIpv4SingleLocatorPos.LOCATOR_COUNT]);
 
-        assertEquals(AddressFamilyNumberEnum.IP.getIanaCode(), ByteUtil.getShort(result, MapReplyIpv4SingleLocatorPos.LOC_AFI));
+        assertEquals(AddressFamily.IpV4.getIntValue(), ByteUtil.getInt(result, MapReplyIpv4SingleLocatorPos.LOC_AFI));
 
         assertEquals(0x04030201, ByteUtil.getInt(result, MapReplyIpv4SingleLocatorPos.LOCATOR));
         assertEquals(0x01, result[MapReplyIpv4SingleLocatorPos.LOCATOR_RBIT] & 0x01);
@@ -631,10 +617,10 @@ public class LispSouthboundServiceTest extends BaseTestCase {
     @Test
     @Ignore
     public void mapReply__WithMultipleLocator() throws Exception {
-        eidToLocatorBuilder.getLocatorRecord().add(
-                new LocatorRecordBuilder().setRouted(true).setLispAddressContainer(LispAFIConvertor.toContainer(getIP("4.3.2.1"))).build());
-        eidToLocatorBuilder.getLocatorRecord().add(
-                new LocatorRecordBuilder().setRouted(true).setLispAddressContainer(LispAFIConvertor.toContainer(getIPV6("0:0:0:0:0:0:0:1"))).build());
+        mappingRecordBuilder.getLocatorRecord().add(
+                new LocatorRecordBuilder().setRouted(true).setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1")).build());
+        mappingRecordBuilder.getLocatorRecord().add(
+                new LocatorRecordBuilder().setRouted(true).setRloc(LispAddressUtil.asIpv6Rloc("0:0:0:0:0:0:0:1")).build());
         stubHandleRequest();
 
         byte[] result = handleMapRequestAsByteArray(mapRequestPacket);
@@ -642,11 +628,11 @@ public class LispSouthboundServiceTest extends BaseTestCase {
 
         assertEquals(2, result[MapReplyIpv4SingleLocatorPos.LOCATOR_COUNT]);
 
-        assertEquals(AddressFamilyNumberEnum.IP.getIanaCode(), ByteUtil.getShort(result, MapReplyIpv4SingleLocatorPos.LOC_AFI));
+        assertEquals(AddressFamily.IpV4.getIntValue(), ByteUtil.getInt(result, MapReplyIpv4SingleLocatorPos.LOC_AFI));
         assertEquals(0x04030201, ByteUtil.getInt(result, MapReplyIpv4SingleLocatorPos.LOCATOR));
         assertEquals(0x01, result[MapReplyIpv4SingleLocatorPos.LOCATOR_RBIT] & 0x01);
 
-        assertEquals(AddressFamilyNumberEnum.IP6.getIanaCode(), ByteUtil.getShort(result, MapReplyIpv4SecondLocatorPos.LOC_AFI));
+        assertEquals(AddressFamily.IpV6.getIntValue(), ByteUtil.getInt(result, MapReplyIpv4SecondLocatorPos.LOC_AFI));
 
         byte[] expectedIpv6Rloc = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
         ArrayAssert.assertEquals(expectedIpv6Rloc,
@@ -689,13 +675,16 @@ public class LispSouthboundServiceTest extends BaseTestCase {
                 + "0080   01 64 ff 00 00 05 00 01 0a 01 00 6f 06 64 ff 00 " //
                 + "0090   00 05 00 01 c0 a8 88 33"));
 
-        oneOf(nps).publish(with(lispNotificationSaver));
+        oneOf(nps).putNotification(with(lispNotificationSaver));
         handleMapRequestAsByteArray(mapRequestPacket);
 
     }
 
     private void stubMapRegister(final boolean setNotifyFromRegister) {
-        allowing(nps).publish(with(lispNotificationSaver));
+        try {
+            allowing(nps).putNotification(with(lispNotificationSaver));
+        } catch (InterruptedException e) {
+        }
         will(new SimpleAction() {
 
             @Override
@@ -709,33 +698,36 @@ public class LispSouthboundServiceTest extends BaseTestCase {
     }
 
     private void stubHandleRequest() {
-        allowing(nps).publish(wany(Notification.class));
+        try {
+            allowing(nps).putNotification(wany(Notification.class));
+        } catch (InterruptedException e) {
+        }
     }
 
     private byte[] handleMapRequestAsByteArray(byte[] inPacket) {
         handleMapRequestPacket(inPacket);
-        return lastMapReplyPacket().getData();
+        return lastMapReplyPacket().content().array();
     }
 
     private byte[] handleMapRegisterAsByteArray(byte[] inPacket) {
         handleMapRegisterPacket(inPacket);
-        return lastMapNotifyPacket().getData();
+        return lastMapNotifyPacket().content().array();
     }
 
     private DatagramPacket handleMapRequestPacket(byte[] inPacket) {
-        DatagramPacket dp = new DatagramPacket(inPacket, inPacket.length);
+        DatagramPacket dp = new DatagramPacket(wrappedBuffer(inPacket), new InetSocketAddress(0), new InetSocketAddress(0));
         // Unless we explicitly set the source port, it will be -1, which breaks some tests
         // This is till not the real port number, but it's better
-        dp.setPort(LispMessage.PORT_NUM);
+        //dp.setPort(LispMessage.PORT_NUM);
         testedLispService.handlePacket(dp);
         return lastMapReplyPacket();
     }
 
     private DatagramPacket handleMapRegisterPacket(byte[] inPacket) {
-        DatagramPacket dp = new DatagramPacket(inPacket, inPacket.length);
+        DatagramPacket dp = new DatagramPacket(wrappedBuffer(inPacket), new InetSocketAddress(0), new InetSocketAddress(0));
         // Unless we explicitly set the source port, it will be -1, which breaks some tests
         // This is till not the real port number, but it's better
-        dp.setPort(LispMessage.PORT_NUM);
+        //dp.setPort(LispMessage.PORT_NUM);
         testedLispService.handlePacket(dp);
         if (mapNotifyBuilder == null) {
             return null;
@@ -746,7 +738,7 @@ public class LispSouthboundServiceTest extends BaseTestCase {
 
     private DatagramPacket handlePacket(byte[] inPacket) {
         // TODO get from mock
-        testedLispService.handlePacket(new DatagramPacket(inPacket, inPacket.length));
+        testedLispService.handlePacket(new DatagramPacket(wrappedBuffer(inPacket), new InetSocketAddress(0), new InetSocketAddress(0)));
         return null;
     }
 
@@ -789,7 +781,7 @@ public class LispSouthboundServiceTest extends BaseTestCase {
     // + "40 05 c0 a8 88 0a 01 02 " // MAC (ITR-RLOC #1 of 2)
     // + "00 01 01 02 03 04 " // IP (ITR-RLOC #2 of 2)
     // + "00 20 00 01 01 02 03 04").array();
-    // oneOf(nps).publish(with(lispNotificationSaver));
+    // oneOf(nps).putNotification(with(lispNotificationSaver));
     // // ret(mapReply);
     // DatagramPacket packet = handleMapRequestPacket(mapRequestPacket);
     // assertEquals(2, lastMapRequest().getItrRlocs().size());
@@ -806,7 +798,7 @@ public class LispSouthboundServiceTest extends BaseTestCase {
     // + "00 01 01 02 03 04 " // IP (ITR-RLOC #1 of 2)
     // + "00 01 c0 a8 88 0a " // MAC (ITR-RLOC #2 of 2)
     // + "00 20 00 01 01 02 03 04").array();
-    // oneOf(nps).publish(with(lispNotificationSaver));
+    // oneOf(nps).putNotification(with(lispNotificationSaver));
     // // ret(mapReply);
     // DatagramPacket packet = handleMapRequestPacket(mapRequestPacket);
     // assertEquals(2, lastMapRequest().getItrRloc().size());