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/main/java/org/onosproject/segmentrouting/RouteHandler.java b/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
index 6d77da4..b278b8c 100644
--- a/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
+++ b/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
@@ -83,26 +83,24 @@
     }
 
     protected void init(DeviceId deviceId) {
-        srManager.routeService.getRouteTables().forEach(routeTableId ->
-            srManager.routeService.getRoutes(routeTableId).forEach(routeInfo ->
-                routeInfo.allRoutes().forEach(resolvedRoute ->
-                    srManager.nextHopLocations(resolvedRoute).stream()
-                            .filter(location -> deviceId.equals(location.deviceId()))
-                            .forEach(location -> processRouteAddedInternal(resolvedRoute)
-                    )
-                )
-            )
-        );
+        Optional<DeviceId> pairDeviceId = srManager.getPairDeviceId(deviceId);
+
+        srManager.routeService.getRouteTables().stream()
+                .map(srManager.routeService::getRoutes)
+                .flatMap(Collection::stream)
+                .map(RouteInfo::allRoutes)
+                .filter(allRoutes -> allRoutes.stream().allMatch(resolvedRoute ->
+                        srManager.nextHopLocations(resolvedRoute).stream().allMatch(cp ->
+                            deviceId.equals(cp.deviceId()) ||
+                                    (pairDeviceId.isPresent() && pairDeviceId.get().equals(cp.deviceId()))
+                        )))
+                .forEach(this::processRouteAddedInternal);
     }
 
     void processRouteAdded(RouteEvent event) {
         enqueueRouteEvent(event);
     }
 
-    private void processRouteAddedInternal(ResolvedRoute route) {
-        processRouteAddedInternal(Sets.newHashSet(route));
-    }
-
     private void processRouteAddedInternal(Collection<ResolvedRoute> routes) {
         if (!isReady()) {
             log.info("System is not ready. Skip adding route for {}", routes);