Correctly initialize routes with multiple next hops

- Solve an issue where next hops are available on both leaf switch but one still pointing to its pair through the spines
- Improve unit tests

Change-Id: I94fe79bd9289efe544d82b858928d65201a0b0b2
diff --git a/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java b/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java
index ef4c2aa..bdf056e 100644
--- a/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java
+++ b/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java
@@ -75,6 +75,7 @@
     private static final Map<ConnectPoint, Set<IpPrefix>> SUBNET_TABLE = Maps.newConcurrentMap();
     // Mocked Next Id
     private static final Map<Integer, TrafficTreatment> NEXT_TABLE = Maps.newConcurrentMap();
+    private static final Map<IpPrefix, Set<ResolvedRoute>> ROUTE_STORE = Maps.newConcurrentMap();
 
     private static final IpPrefix P1 = IpPrefix.valueOf("10.0.0.0/24");
 
@@ -167,7 +168,7 @@
         hostService = new MockHostService(HOSTS);
         srManager.hostService = hostService;
         srManager.cfgService = mockNetworkConfigRegistry;
-        srManager.routeService = new MockRouteService(ROUTING_TABLE);
+        srManager.routeService = new MockRouteService(ROUTE_STORE);
 
         routeHandler = new RouteHandler(srManager) {
             // routeEventCache is not necessary for unit tests
@@ -184,9 +185,7 @@
 
     @Test
     public void init() {
-        MockRoutingTableKey rtk = new MockRoutingTableKey(CP1.deviceId(), P1);
-        MockRoutingTableValue rtv = new MockRoutingTableValue(CP1.port(), M1, V1);
-        ROUTING_TABLE.put(rtk, rtv);
+        ROUTE_STORE.put(P1, Sets.newHashSet(RR1));
 
         routeHandler.init(CP1.deviceId());
 
@@ -201,6 +200,27 @@
     }
 
     @Test
+    public void initTwoNextHops() {
+        ROUTE_STORE.put(P1, Sets.newHashSet(RR1, RR2));
+
+        routeHandler.init(CP1.deviceId());
+
+        assertEquals(2, ROUTING_TABLE.size());
+        MockRoutingTableValue rtv1 = ROUTING_TABLE.get(new MockRoutingTableKey(CP1.deviceId(), P1));
+        assertEquals(M1, rtv1.macAddress);
+        assertEquals(V1, rtv1.vlanId);
+        assertEquals(CP1.port(), rtv1.portNumber);
+        MockRoutingTableValue rtv2 = ROUTING_TABLE.get(new MockRoutingTableKey(CP2.deviceId(), P1));
+        assertEquals(M2, rtv2.macAddress);
+        assertEquals(V2, rtv2.vlanId);
+        assertEquals(CP2.port(), rtv2.portNumber);
+
+        assertEquals(2, SUBNET_TABLE.size());
+        assertTrue(SUBNET_TABLE.get(CP1).contains(P1));
+        assertTrue(SUBNET_TABLE.get(CP2).contains(P1));
+    }
+
+    @Test
     public void processRouteAdded() {
         reset(srManager.deviceConfiguration);
         srManager.deviceConfiguration.addSubnet(CP1, P1);
@@ -390,6 +410,8 @@
     public void testDualHomedSingleLocationFail() {
         testOneDualHomedAdded();
 
+        ROUTE_STORE.put(P1, Sets.newHashSet(RR3));
+
         HostEvent he = new HostEvent(HostEvent.Type.HOST_MOVED, H3S, H3D);
         routeHandler.processHostMovedEvent(he);