Unit tests for NetworkCongifLinksProvider

Also fixed a few bugs in the provider that were turned up by the new tests.

Change-Id: Icafc945251b4d35ac3f285302af150c0a4d646d6
diff --git a/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java b/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
index edbc25c..2671d93 100644
--- a/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
+++ b/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
@@ -117,7 +117,7 @@
     private final InternalDeviceListener deviceListener = new InternalDeviceListener();
     private final InternalConfigListener cfgListener = new InternalConfigListener();
 
-    private Set<LinkKey> configuredLinks = new HashSet<>();
+    protected Set<LinkKey> configuredLinks = new HashSet<>();
 
     public NetworkConfigLinksProvider() {
         super(new ProviderId("lldp", PROVIDER_NAME));
@@ -259,6 +259,35 @@
     }
 
     /**
+     * Removes after stopping discovery helper for specified device.
+     * @param deviceId device to remove
+     */
+    private void removeDevice(final DeviceId deviceId) {
+        discoverers.computeIfPresent(deviceId, (did, ld) -> {
+            ld.stop();
+            return null;
+        });
+
+    }
+
+    /**
+     * Removes a port from the specified discovery helper.
+     * @param port the port
+     */
+    private void removePort(Port port) {
+        if (port.element() instanceof Device) {
+            Device d = (Device) port.element();
+            LinkDiscovery ld = discoverers.get(d.id());
+            if (ld != null) {
+                ld.removePort(port.number());
+            }
+        } else {
+            log.warn("Attempted to remove non-Device port", port);
+        }
+    }
+
+
+    /**
      * Processes incoming packets.
      */
     private class InternalPacketProcessor implements PacketProcessor {
@@ -355,21 +384,21 @@
                         updateDevice(device).ifPresent(ld -> updatePort(ld, port));
                     } else {
                         log.debug("Port down {}", port);
-                        //removePort(port);
+                        removePort(port);
                         providerService.linksVanished(new ConnectPoint(port.element().id(),
                                                                        port.number()));
                     }
                     break;
                 case PORT_REMOVED:
                     log.debug("Port removed {}", port);
-                    //removePort(port);
+                    removePort(port);
                     providerService.linksVanished(new ConnectPoint(port.element().id(),
                                                                    port.number()));
                     break;
                 case DEVICE_REMOVED:
                 case DEVICE_SUSPENDED:
                     log.debug("Device removed {}", deviceId);
-                    //removeDevice(deviceId);
+                    removeDevice(deviceId);
                     providerService.linksVanished(deviceId);
                     break;
                 case DEVICE_AVAILABILITY_CHANGED:
@@ -378,7 +407,7 @@
                         updateDevice(device).ifPresent(ld -> updatePorts(ld, deviceId));
                     } else {
                         log.debug("Device down {}", deviceId);
-                        //removeDevice(deviceId);
+                        removeDevice(deviceId);
                         providerService.linksVanished(deviceId);
                     }
                     break;