@Test
  public void deserialize__Bits() throws Exception {
    Rloc address =
        LispAddressSerializer.getInstance()
            .deserializeRloc(
                hexToByteBuffer(
                    "40 03 00 00 "
                        + //
                        "0A 00 00 10 "
                        + //
                        "00 05 00 01 AA BB CC DD "
                        + // IPv4
                        "00 02 00 01 11 22 33 44")); // IPv4

    assertEquals(ExplicitLocatorPathLcaf.class, address.getAddressType());
    ExplicitLocatorPath elp = (ExplicitLocatorPath) address.getAddress();

    List<Hop> hops = elp.getExplicitLocatorPath().getHop();
    assertEquals(2, hops.size());

    assertEquals("170.187.204.221", String.valueOf(hops.get(0).getAddress().getValue()));
    assertEquals(true, hops.get(0).getLrsBits().isLookup().booleanValue());
    assertEquals(false, hops.get(0).getLrsBits().isRlocProbe().booleanValue());
    assertEquals(true, hops.get(0).getLrsBits().isStrict().booleanValue());
    assertEquals("17.34.51.68", String.valueOf(hops.get(1).getAddress().getValue()));
    assertEquals(false, hops.get(1).getLrsBits().isLookup().booleanValue());
    assertEquals(true, hops.get(1).getLrsBits().isRlocProbe().booleanValue());
    assertEquals(false, hops.get(1).getLrsBits().isStrict().booleanValue());
  }
  @Test
  public void deserialize__NoAddresses() throws Exception {
    Rloc address =
        LispAddressSerializer.getInstance()
            .deserializeRloc(
                hexToByteBuffer(
                    "40 03 00 00 "
                        + //
                        "0A 00 00 00 "));

    assertEquals(ExplicitLocatorPathLcaf.class, address.getAddressType());
    ExplicitLocatorPath elp = (ExplicitLocatorPath) address.getAddress();

    List<Hop> hops = elp.getExplicitLocatorPath().getHop();
    assertEquals(0, hops.size());
  }
  private MappingRecord updateServicePathMappingRecord(MappingRecord mapping, Eid eid) {
    // keep properties of original record
    MappingRecordBuilder recordBuilder = new MappingRecordBuilder(mapping);
    recordBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());

    // there should only be one locator record
    if (mapping.getLocatorRecord().size() != 1) {
      LOG.warn("MappingRecord associated to ServicePath EID has more than one locator!");
      return mapping;
    }

    LocatorRecord locatorRecord = mapping.getLocatorRecord().get(0);
    long serviceIndex = ((ServicePath) eid.getAddress()).getServicePath().getServiceIndex();
    int index = LispAddressUtil.STARTING_SERVICE_INDEX - (int) serviceIndex;
    Rloc rloc = locatorRecord.getRloc();
    if (rloc.getAddress() instanceof Ipv4 || rloc.getAddress() instanceof Ipv6) {
      if (index != 0) {
        LOG.warn("Service Index should be 255 for simple IP RLOCs!");
      }
      return mapping;
    } else if (rloc.getAddress() instanceof ExplicitLocatorPath) {
      ExplicitLocatorPath elp = (ExplicitLocatorPath) rloc.getAddress();
      List<Hop> hops = elp.getExplicitLocatorPath().getHop();

      if (index < 0 || index > hops.size()) {
        LOG.warn("Service Index out of bounds!");
        return mapping;
      }

      SimpleAddress nextHop = hops.get(index).getAddress();
      LocatorRecordBuilder lrb = new LocatorRecordBuilder(locatorRecord);
      lrb.setRloc(LispAddressUtil.toRloc(nextHop));
      recordBuilder.getLocatorRecord().add(lrb.build());
      return recordBuilder.build();
    } else {
      LOG.warn("Nothing to do with ServicePath mapping record");
      return mapping;
    }
  }