+ void deleteSouthboundMappings(final Site dstSite) {
+ emitMapRegisterMessage(dstSite, false);
+
+ }
+
+ void storeSouthboundMappings(final boolean merge, final Site ... sites) {
+ for (Site site : sites) {
+ storeDestinationSiteMappingViaSouthbound(site, merge);
+ }
+ }
+
+ boolean isPossibleAssertPingResultImmediately(final boolean expectedPingWorks, final boolean isPartialyWorking,
+ final String msg) {
+ //ping fail is unwanted. ping definitely failed
+ if (expectedPingWorks && !isPartialyWorking) {
+ fail(msg);
+ }
+
+ //ping fail is wanted. still can fail later
+ if (!expectedPingWorks && isPartialyWorking) {
+ return false;
+ }
+
+ //ping fail is unwanted. still can fail later
+ if (expectedPingWorks && isPartialyWorking) {
+ return false;
+ }
+
+ //ping fail is wanted. ping definitely failed.
+ if (!expectedPingWorks && !isPartialyWorking) {
+ return true;
+ }
+ return false;
+ }
+
+ boolean checkActionAndRloc(final Site dstSite, boolean expectedPingWorks, MapReply mapReplyFromSrcToDst, final
+ Site ... additionalSitesFromMapping) {
+ final MappingRecord mappingRecord = verifyMappingRecord(mapReplyFromSrcToDst);
+ final boolean isNotDroppendSrcDst = !MappingRecord.Action.Drop.equals(mappingRecord.getAction());
+
+ if (isPossibleAssertPingResultImmediately(expectedPingWorks, isNotDroppendSrcDst, "Drop action has appeared " +
+ "during ping")) {
+ return true;
+ }
+
+ final List<LocatorRecord> locatorRecords = verifyLocatorRecordExists(mappingRecord);
+ for (Site expectedTargetSite : concatenateSites(dstSite, additionalSitesFromMapping)) {
+ boolean expectedTargetFound = false;
+ for (LocatorRecord locatorRecord : locatorRecords) {
+ if (expectedTargetSite.getRloc().equals(rlocToString(locatorRecord))) {
+ final Ipv4Address ipv4AddressSrcDst = verifyIpv4Address(locatorRecord);
+ final boolean isRlocSrcDstEqual = ipv4AddressSrcDst.getValue().equals(expectedTargetSite.getRloc());
+ if (isPossibleAssertPingResultImmediately(expectedPingWorks, isRlocSrcDstEqual, "Unexpected RLOC." +
+ "Expected value " + dstSite.getRloc() + ". Real value " + ipv4AddressSrcDst.getValue() +
+ ".")) {
+ return true;
+ }
+
+ final boolean isWeightEquals = expectedTargetSite.getWeight() == locatorRecord.getWeight();
+ if (isPossibleAssertPingResultImmediately(expectedPingWorks, isWeightEquals, "Weight isn't equal." +
+ "Expected value " + expectedTargetSite.getWeight() + ". Value from mapping" +
+ locatorRecord.getWeight() + ".")) {
+ return true;
+ }
+
+ final boolean isPriorityEquals = expectedTargetSite.getPriority() == locatorRecord.getPriority();
+ if (isPossibleAssertPingResultImmediately(expectedPingWorks, isPriorityEquals, "Priority isn't " +
+ "equal. Expected value " + expectedTargetSite.getPriority() + ". Value from mapping" +
+ locatorRecord.getPriority() + ".")) {
+ return true;
+ }
+
+ expectedTargetFound = true;
+ break;
+ }
+ }
+ if (isPossibleAssertPingResultImmediately(expectedPingWorks, expectedTargetFound, "Mapping for " +
+ expectedTargetSite.getRloc() + " was expected but wasn't returned from mapping service." +
+ expectedTargetFound)) {
+ return true;
+ }
+
+ }