CORD-1578 CORD-1708 Handle dual single homed router and single dual homed router

In addition
    - Carry all alternatives in ROUTE_UPDATED and ROUTE_REMOVED event
    - More unit tests
    - More debug messages
    - Fix routing table out-of-sync issue in MockRoutingService
    - Fix populateRoute/revokeRoute mastership issue

Change-Id: I22d537625b570b09ecd4e22e6e14bb1ee27f8bcb
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/DefaultResolvedRouteStore.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/DefaultResolvedRouteStore.java
index 4981932..725a7a9 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/DefaultResolvedRouteStore.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/DefaultResolvedRouteStore.java
@@ -143,7 +143,7 @@
                                 immutableAlternatives);
                     } else {
                         return new RouteEvent(RouteEvent.Type.ROUTE_UPDATED, route,
-                                oldRoute, immutableAlternatives);
+                                oldRoute, immutableAlternatives, oldRoutes);
                     }
                 }
 
@@ -185,11 +185,11 @@
                 String key = createBinaryString(prefix);
 
                 ResolvedRoute route = routeTable.getValueForExactKey(key);
-                alternativeRoutes.remove(prefix);
+                Set<ResolvedRoute> alternatives = alternativeRoutes.remove(prefix);
 
                 if (route != null) {
                     routeTable.remove(key);
-                    return new RouteEvent(RouteEvent.Type.ROUTE_REMOVED, route);
+                    return new RouteEvent(RouteEvent.Type.ROUTE_REMOVED, route, alternatives);
                 }
                 return null;
             }
diff --git a/apps/route-service/app/src/test/java/org/onosproject/routeservice/impl/RouteManagerTest.java b/apps/route-service/app/src/test/java/org/onosproject/routeservice/impl/RouteManagerTest.java
index 8febe68..3ba34da 100644
--- a/apps/route-service/app/src/test/java/org/onosproject/routeservice/impl/RouteManagerTest.java
+++ b/apps/route-service/app/src/test/java/org/onosproject/routeservice/impl/RouteManagerTest.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.routeservice.impl;
 
+import java.util.Collection;
 import java.util.Collections;
 
 import org.junit.Before;
@@ -212,7 +213,8 @@
     private void verifyRouteAdd(Route route, ResolvedRoute resolvedRoute) {
         reset(routeListener);
 
-        routeListener.event(event(RouteEvent.Type.ROUTE_ADDED, resolvedRoute));
+        routeListener.event(event(RouteEvent.Type.ROUTE_ADDED, resolvedRoute, null,
+                Sets.newHashSet(resolvedRoute), null));
 
         replay(routeListener);
 
@@ -267,7 +269,8 @@
         addRoute(original);
 
         routeListener.event(event(RouteEvent.Type.ROUTE_UPDATED,
-                updatedResolvedRoute, resolvedRoute));
+                updatedResolvedRoute, resolvedRoute,
+                Sets.newHashSet(updatedResolvedRoute), Sets.newHashSet(resolvedRoute)));
         expectLastCall().once();
 
         replay(routeListener);
@@ -304,7 +307,7 @@
         addRoute(route);
 
         RouteEvent withdrawRouteEvent = new RouteEvent(RouteEvent.Type.ROUTE_REMOVED,
-                removedResolvedRoute);
+                removedResolvedRoute, Sets.newHashSet(removedResolvedRoute));
 
         reset(routeListener);
         routeListener.event(withdrawRouteEvent);
@@ -342,8 +345,9 @@
 
         // Now when we send the event, we expect the FIB update to be sent
         reset(routeListener);
-        routeListener.event(event(RouteEvent.Type.ROUTE_ADDED,
-                new ResolvedRoute(route, MAC1, CP1)));
+        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1, CP1);
+        routeListener.event(event(RouteEvent.Type.ROUTE_ADDED, resolvedRoute, null,
+                Sets.newHashSet(resolvedRoute), null));
         replay(routeListener);
 
         Host host = createHost(MAC1, V4_NEXT_HOP1);
@@ -362,12 +366,10 @@
         verify(routeListener);
     }
 
-    private static RouteEvent event(RouteEvent.Type type, ResolvedRoute subject) {
-        return event(type, subject, null);
-    }
-
-    private static RouteEvent event(RouteEvent.Type type, ResolvedRoute subject, ResolvedRoute prevSubject) {
-        return new RouteEvent(type, subject, prevSubject, Collections.singleton(subject));
+    private static RouteEvent event(RouteEvent.Type type, ResolvedRoute subject, ResolvedRoute prevSubject,
+                                    Collection<ResolvedRoute> alternatives,
+                                    Collection<ResolvedRoute> prevAlternatives) {
+        return new RouteEvent(type, subject, prevSubject, alternatives, prevAlternatives);
     }
 
     /**