[ONOS-5749] Add unit test for LISP device provider

Change-Id: I0ecb39e86f54dc381be68b69b38351def26fedd2
diff --git a/providers/lisp/device/BUCK b/providers/lisp/device/BUCK
index 240d54f..14d1d09 100644
--- a/providers/lisp/device/BUCK
+++ b/providers/lisp/device/BUCK
@@ -3,6 +3,11 @@
     '//protocols/lisp/api:onos-protocols-lisp-api',
 ]
 
+TEST_DEPS = [
+    '//lib:TEST_ADAPTERS',
+]
+
 osgi_jar_with_tests (
     deps = COMPILE_DEPS,
+    test_deps = TEST_DEPS,
 )
diff --git a/providers/lisp/device/pom.xml b/providers/lisp/device/pom.xml
index 2370a53..1416189 100644
--- a/providers/lisp/device/pom.xml
+++ b/providers/lisp/device/pom.xml
@@ -46,6 +46,11 @@
             <artifactId>onos-lisp-ctl</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/providers/lisp/device/src/test/java/org/onosproject/provider/lisp/device/impl/LispControllerAdapter.java b/providers/lisp/device/src/test/java/org/onosproject/provider/lisp/device/impl/LispControllerAdapter.java
new file mode 100644
index 0000000..22c651f
--- /dev/null
+++ b/providers/lisp/device/src/test/java/org/onosproject/provider/lisp/device/impl/LispControllerAdapter.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.provider.lisp.device.impl;
+
+import org.onosproject.lisp.ctl.LispController;
+import org.onosproject.lisp.ctl.LispMessageListener;
+import org.onosproject.lisp.ctl.LispRouter;
+import org.onosproject.lisp.ctl.LispRouterId;
+import org.onosproject.lisp.ctl.LispRouterListener;
+
+/**
+ * Test Adapter for LispController.
+ */
+public class LispControllerAdapter implements LispController {
+    @Override
+    public Iterable<LispRouter> getRouters() {
+        return null;
+    }
+
+    @Override
+    public Iterable<LispRouter> getSubscribedRouters() {
+        return null;
+    }
+
+    @Override
+    public LispRouter connectRouter(LispRouterId routerId) {
+        return null;
+    }
+
+    @Override
+    public void disconnectRouter(LispRouterId routerId, boolean remove) {
+
+    }
+
+    @Override
+    public LispRouter getRouter(LispRouterId routerId) {
+        return null;
+    }
+
+    @Override
+    public void addRouterListener(LispRouterListener listener) {
+
+    }
+
+    @Override
+    public void removeRouterListener(LispRouterListener listener) {
+
+    }
+
+    @Override
+    public void addMessageListener(LispMessageListener listener) {
+
+    }
+
+    @Override
+    public void removeMessageListener(LispMessageListener listener) {
+
+    }
+}
diff --git a/providers/lisp/device/src/test/java/org/onosproject/provider/lisp/device/impl/LispDeviceProviderTest.java b/providers/lisp/device/src/test/java/org/onosproject/provider/lisp/device/impl/LispDeviceProviderTest.java
new file mode 100644
index 0000000..c040ca3
--- /dev/null
+++ b/providers/lisp/device/src/test/java/org/onosproject/provider/lisp/device/impl/LispDeviceProviderTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.provider.lisp.device.impl;
+
+import com.google.common.collect.Sets;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.core.DefaultApplicationId;
+import org.onosproject.lisp.ctl.LispController;
+import org.onosproject.lisp.ctl.LispRouter;
+import org.onosproject.lisp.ctl.LispRouterListener;
+import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.device.DeviceProvider;
+import org.onosproject.net.device.DeviceProviderRegistry;
+import org.onosproject.net.device.DeviceProviderRegistryAdapter;
+import org.onosproject.net.device.DeviceProviderService;
+import org.onosproject.net.device.DeviceProviderServiceAdapter;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.DeviceServiceAdapter;
+import org.onosproject.net.provider.ProviderId;
+
+import java.util.Set;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * LISP device provider unit test.
+ */
+public class LispDeviceProviderTest {
+
+    private static final String APP_NAME = "org.onosproject.lisp";
+
+    private final LispDeviceProvider provider = new LispDeviceProvider();
+    private final LispController controller = new MockLispController();
+
+    // provider mocks
+    private final DeviceProviderRegistry providerRegistry = new MockDeviceProviderRegistry();
+    private final DeviceProviderService providerService = new MockDeviceProviderService();
+    private final DeviceService deviceService = new MockDeviceService();
+
+    private final Set<LispRouterListener> routerListeners = Sets.newCopyOnWriteArraySet();
+
+    private CoreService coreService;
+    private ApplicationId appId = new DefaultApplicationId(200, APP_NAME);
+    private Set<DeviceListener> deviceListeners = Sets.newHashSet();
+
+    @Before
+    public void setUp() {
+        coreService = createMock(CoreService.class);
+        expect(coreService.registerApplication(APP_NAME))
+                .andReturn(appId).anyTimes();
+        replay(coreService);
+        provider.coreService = coreService;
+        provider.providerRegistry = providerRegistry;
+        provider.deviceService = deviceService;
+        provider.controller = controller;
+        provider.activate();
+    }
+
+    @Test
+    public void activate() throws Exception {
+
+        assertEquals("Provider should be registered", 1,
+                            providerRegistry.getProviders().size());
+        assertTrue("LISP device provider should be registered",
+                            providerRegistry.getProviders().contains(provider.id()));
+        assertEquals("Incorrect provider service",
+                            providerService, provider.providerService);
+        assertEquals("LISP router listener should be registered", 1,
+                            routerListeners.size());
+    }
+
+    @Test
+    public void deactivate() throws Exception {
+        provider.deactivate();
+
+        assertFalse("Provider should not be registered",
+                            providerRegistry.getProviders().contains(provider));
+        assertNull("Provider service should be null",
+                            provider.providerService);
+        assertEquals("Controller listener should be removed", 0,
+                            routerListeners.size());
+    }
+
+    /**
+     * Mock class for LispController.
+     */
+    private class MockLispController extends LispControllerAdapter {
+
+        Iterable<LispRouter> routers = Sets.newHashSet();
+
+        @Override
+        public Iterable<LispRouter> getRouters() {
+            return routers;
+        }
+
+        @Override
+        public void addRouterListener(LispRouterListener listener) {
+            if (!routerListeners.contains(listener)) {
+                routerListeners.add(listener);
+            }
+        }
+
+        @Override
+        public void removeRouterListener(LispRouterListener listener) {
+            routerListeners.remove(listener);
+        }
+    }
+
+    /**
+     * Mock class for DeviceProviderRegistry.
+     */
+    private class MockDeviceProviderRegistry extends DeviceProviderRegistryAdapter {
+        Set<ProviderId> providers = Sets.newHashSet();
+
+        @Override
+        public DeviceProviderService register(DeviceProvider provider) {
+            providers.add(provider.id());
+            return providerService;
+        }
+
+        @Override
+        public void unregister(DeviceProvider provider) {
+            providers.remove(provider.id());
+        }
+
+        @Override
+        public Set<ProviderId> getProviders() {
+            return providers;
+        }
+    }
+
+    /**
+     * Mock class for DeviceService.
+     */
+    private class MockDeviceService extends DeviceServiceAdapter {
+        @Override
+        public void addListener(DeviceListener listener) {
+            deviceListeners.add(listener);
+        }
+
+        @Override
+        public void removeListener(DeviceListener listener) {
+            deviceListeners.remove(listener);
+        }
+    }
+
+    /**
+     * Mock class for DeviceProviderService.
+     */
+    private class MockDeviceProviderService extends DeviceProviderServiceAdapter {
+
+    }
+}