Move internal classes under .impl package (1/2)
Change-Id: I72ed933ecd5ae7ffb268967f80fb395e90f7d8e9
diff --git a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
new file mode 100644
index 0000000..8287e6d
--- /dev/null
+++ b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
@@ -0,0 +1,415 @@
+/*
+ * Copyright 2016-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.netconf.ctl.impl;
+
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.osgi.ComponentContextAdapter;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cfg.ComponentConfigAdapter;
+import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.key.DeviceKeyService;
+import org.onosproject.netconf.NetconfDevice;
+import org.onosproject.netconf.NetconfDeviceFactory;
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfDeviceListener;
+import org.onosproject.netconf.NetconfDeviceOutputEvent;
+import org.onosproject.netconf.NetconfDeviceOutputEventListener;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.osgi.service.component.ComponentContext;
+
+import java.lang.reflect.Field;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+/**
+ * Unit tests for the Netconf controller implementation test.
+ */
+public class NetconfControllerImplTest {
+
+ NetconfControllerImpl ctrl;
+
+ //DeviceInfo
+ NetconfDeviceInfo deviceInfo1;
+ NetconfDeviceInfo deviceInfo2;
+ NetconfDeviceInfo badDeviceInfo3;
+ NetconfDeviceInfo deviceInfoIpV6;
+
+ //Devices & DeviceId
+ NetconfDevice device1;
+ DeviceId deviceId1;
+ NetconfDevice device2;
+ DeviceId deviceId2;
+
+ //Events
+ NetconfDeviceOutputEvent eventForDeviceInfo1;
+ NetconfDeviceOutputEvent eventForDeviceInfo2;
+
+ private Map<DeviceId, NetconfDevice> reflectedDeviceMap;
+ private NetconfDeviceOutputEventListener reflectedDownListener;
+
+ //Test Device IP addresses and ports
+ private static final String DEVICE_1_IP = "10.10.10.11";
+ private static final String DEVICE_2_IP = "10.10.10.12";
+ private static final String BAD_DEVICE_IP = "10.10.10.13";
+ private static final String DEVICE_IPV6 = "2001:db8::1";
+
+ private static final int DEVICE_1_PORT = 11;
+ private static final int DEVICE_2_PORT = 12;
+ private static final int BAD_DEVICE_PORT = 13;
+ private static final int IPV6_DEVICE_PORT = 14;
+
+ private static ComponentConfigService cfgService = new ComponentConfigAdapter();
+ private static DeviceService deviceService = new NetconfDeviceServiceMock();
+ private static DeviceKeyService deviceKeyService = new NetconfDeviceKeyServiceMock();
+
+ private final ComponentContext context = new MockComponentContext();
+
+ @Before
+ public void setUp() throws Exception {
+ ctrl = new NetconfControllerImpl();
+ ctrl.deviceFactory = new TestNetconfDeviceFactory();
+ ctrl.cfgService = cfgService;
+ ctrl.deviceService = deviceService;
+ ctrl.deviceKeyService = deviceKeyService;
+
+ //Creating mock devices
+ deviceInfo1 = new NetconfDeviceInfo("device1", "001", IpAddress.valueOf(DEVICE_1_IP), DEVICE_1_PORT);
+ deviceInfo2 = new NetconfDeviceInfo("device2", "002", IpAddress.valueOf(DEVICE_2_IP), DEVICE_2_PORT);
+ badDeviceInfo3 = new NetconfDeviceInfo("device3", "003", IpAddress.valueOf(BAD_DEVICE_IP), BAD_DEVICE_PORT);
+ deviceInfoIpV6 = new NetconfDeviceInfo("deviceIpv6", "004", IpAddress.valueOf(DEVICE_IPV6), IPV6_DEVICE_PORT);
+
+ device1 = new TestNetconfDevice(deviceInfo1);
+ deviceId1 = deviceInfo1.getDeviceId();
+ device2 = new TestNetconfDevice(deviceInfo2);
+ deviceId2 = deviceInfo2.getDeviceId();
+
+ //Adding to the map for testing get device calls.
+ Field field1 = ctrl.getClass().getDeclaredField("netconfDeviceMap");
+ field1.setAccessible(true);
+ reflectedDeviceMap = (Map<DeviceId, NetconfDevice>) field1.get(ctrl);
+ reflectedDeviceMap.put(deviceId1, device1);
+ reflectedDeviceMap.put(deviceId2, device2);
+
+ //Creating mock events for testing NetconfDeviceOutputEventListener
+ Field field2 = ctrl.getClass().getDeclaredField("downListener");
+ field2.setAccessible(true);
+ reflectedDownListener = (NetconfDeviceOutputEventListener) field2.get(ctrl);
+
+ eventForDeviceInfo1 = new NetconfDeviceOutputEvent(NetconfDeviceOutputEvent.Type.DEVICE_NOTIFICATION, null,
+ null, Optional.of(1), deviceInfo1);
+ eventForDeviceInfo2 = new NetconfDeviceOutputEvent(NetconfDeviceOutputEvent.Type.DEVICE_UNREGISTERED, null,
+ null, Optional.of(2), deviceInfo2);
+ }
+
+ @After
+ public void tearDown() {
+ ctrl.deactivate();
+ }
+
+ /**
+ * Test initialization of component configuration.
+ */
+ @Test
+ public void testActivate() {
+ assertEquals("Incorrect NetConf connect timeout, should be default",
+ 5, ctrl.netconfConnectTimeout);
+ assertEquals("Incorrect NetConf reply timeout, should be default",
+ 5, ctrl.netconfReplyTimeout);
+ ctrl.activate(null);
+ assertEquals("Incorrect NetConf connect timeout, should be default",
+ 5, ctrl.netconfConnectTimeout);
+ assertEquals("Incorrect NetConf reply timeout, should be default",
+ 5, ctrl.netconfReplyTimeout); }
+
+ /**
+ * Test modification of component configuration.
+ */
+ @Test
+ public void testModified() {
+ assertEquals("Incorrect NetConf connect timeout, should be default",
+ 5, ctrl.netconfConnectTimeout);
+ assertEquals("Incorrect NetConf session timeout, should be default",
+ 5, ctrl.netconfReplyTimeout);
+ ctrl.modified(context);
+ assertEquals("Incorrect NetConf connect timeout, should be default",
+ 2, ctrl.netconfConnectTimeout);
+ assertEquals("Incorrect NetConf session timeout",
+ 1, ctrl.netconfReplyTimeout);
+ }
+
+ /**
+ * Test to add DeviceListeners,
+ * and also to check whether the netconfDeviceListeners set is
+ * updating or not which was present in NetconfControllerImpl class.
+ */
+ @Test
+ public void testAddRemoveDeviceListener() {
+ NetconfDeviceListener deviceListener1 = EasyMock.createMock(NetconfDeviceListener.class);
+ NetconfDeviceListener deviceListener2 = EasyMock.createMock(NetconfDeviceListener.class);
+ NetconfDeviceListener deviceListener3 = EasyMock.createMock(NetconfDeviceListener.class);
+
+ ctrl.addDeviceListener(deviceListener1);
+ ctrl.addDeviceListener(deviceListener2);
+ ctrl.addDeviceListener(deviceListener3);
+ assertThat("Incorrect number of listeners", ctrl.netconfDeviceListeners, hasSize(3));
+ assertThat("Not matching listeners", ctrl.netconfDeviceListeners, hasItems(deviceListener1,
+ deviceListener2, deviceListener3));
+
+ ctrl.removeDeviceListener(deviceListener1);
+ assertThat("Incorrect number of listeners", ctrl.netconfDeviceListeners, hasSize(2));
+ assertThat("Not matching listeners", ctrl.netconfDeviceListeners, hasItems(deviceListener2, deviceListener3));
+ }
+
+ @Test
+ public void testGetNetconfDevices() {
+ Set<DeviceId> devices = new HashSet<>();
+ devices.add(deviceId1);
+ devices.add(deviceId2);
+ assertTrue("Incorrect devices", ctrl.getNetconfDevices().containsAll(devices));
+ }
+
+ @Test
+ public void testGetNetconfDevice() {
+ NetconfDevice fetchedDevice1 = ctrl.getNetconfDevice(deviceId1);
+ assertThat("Incorrect device fetched", fetchedDevice1, is(device1));
+
+ NetconfDevice fetchedDevice2 = ctrl.getNetconfDevice(deviceId2);
+ assertThat("Incorrect device fetched", fetchedDevice2, is(device2));
+ }
+
+ @Test
+ public void testGetNetconfDeviceWithIPPort() {
+ NetconfDevice fetchedDevice1 = ctrl.getNetconfDevice(IpAddress.valueOf(DEVICE_1_IP), DEVICE_1_PORT);
+ assertEquals("Incorrect device fetched", fetchedDevice1.getDeviceInfo().ip(), device1.getDeviceInfo().ip());
+
+ NetconfDevice fetchedDevice2 = ctrl.getNetconfDevice(IpAddress.valueOf(DEVICE_2_IP), DEVICE_2_PORT);
+ assertEquals("Incorrect device fetched", fetchedDevice2.getDeviceInfo().ip(), device2.getDeviceInfo().ip());
+ }
+
+ /**
+ * Check for bad device connection. In this case the device map shouldn't get modified.
+ */
+ @Test(expected = NetconfException.class)
+ public void testConnectBadDevice() throws Exception {
+ reflectedDeviceMap.clear();
+ try {
+ ctrl.connectDevice(badDeviceInfo3.getDeviceId());
+ } finally {
+ assertEquals("Incorrect device connection", 0, ctrl.getDevicesMap().size());
+ }
+ }
+
+ /**
+ * Check for correct device connection. In this case the device map get modified.
+ */
+ @Test
+ public void testConnectCorrectDevice() throws Exception {
+ reflectedDeviceMap.clear();
+ ctrl.connectDevice(deviceInfo1.getDeviceId());
+ ctrl.connectDevice(deviceInfo2.getDeviceId());
+ assertTrue("Incorrect device connection", ctrl.getDevicesMap().containsKey(deviceId1));
+ assertTrue("Incorrect device connection", ctrl.getDevicesMap().containsKey(deviceId2));
+ assertEquals("Incorrect device connection", 2, ctrl.getDevicesMap().size());
+ }
+
+ /**
+ * Check for correct ipv6 device connection. In this case the device map get modified.
+ */
+ @Test
+ public void testConnectCorrectIpv6Device() throws Exception {
+ reflectedDeviceMap.clear();
+ ctrl.connectDevice(deviceInfoIpV6.getDeviceId());
+ assertTrue("Incorrect device connection", ctrl.getDevicesMap()
+ .containsKey(deviceInfoIpV6.getDeviceId()));
+ assertEquals("Incorrect device connection", 1, ctrl.getDevicesMap().size());
+ }
+
+
+ /**
+ * Check for connect devices already added to the map.
+ */
+ @Test
+ public void testConnectAlreadyExistingDevice() throws Exception {
+ NetconfDevice alreadyExistingDevice1 = ctrl.connectDevice(deviceInfo1.getDeviceId());
+ NetconfDevice alreadyExistingDevice2 = ctrl.connectDevice(deviceInfo2.getDeviceId());
+ assertEquals("Incorrect device connection", alreadyExistingDevice1.getDeviceInfo().getDeviceId(),
+ deviceInfo1.getDeviceId());
+ assertEquals("Incorrect device connection", alreadyExistingDevice2.getDeviceInfo().getDeviceId(),
+ deviceInfo2.getDeviceId());
+ }
+
+ /**
+ * Check that disconnectDevice actually disconnects the device and removes it.
+ */
+ @Test
+ public void testDisconnectDevice() throws Exception {
+ ctrl.disconnectDevice(deviceInfo1.getDeviceId(), true);
+ assertFalse("Incorrect device removal", ctrl.getDevicesMap().containsKey(deviceId1));
+ }
+
+ /**
+ * Checks that disconnectDevice actually disconnects the device and removes it.
+ */
+ @Test
+ public void testRemoveDevice() throws Exception {
+ ctrl.removeDevice(deviceInfo1.getDeviceId());
+ assertFalse("Incorrect device removal", ctrl.getDevicesMap().containsKey(deviceId1));
+ }
+
+ /**
+ * Test to get the connected device map.
+ */
+ @Test
+ public void testGetDevicesMap() {
+ assertEquals("Incorrect device map size", 2, ctrl.getDevicesMap().size());
+ }
+
+ /**
+ * Test to check whether the DeviceDownEventListener removes the device from the map when session
+ * for a particular device getting closed.
+ */
+ @Test
+ public void testDeviceDownEventListener() throws Exception {
+ reflectedDeviceMap.clear();
+ ctrl.connectDevice(deviceInfo1.getDeviceId());
+ boolean result1 = reflectedDownListener.isRelevant(eventForDeviceInfo2);
+ assertFalse("Irrelevant Device Event", result1);
+ assertEquals("Incorrect device map size", 1, ctrl.getDevicesMap().size());
+ reflectedDownListener.event(eventForDeviceInfo1);
+ assertEquals("Incorrect device map size", 1, ctrl.getDevicesMap().size());
+ ctrl.connectDevice(deviceInfo2.getDeviceId());
+ boolean result2 = reflectedDownListener.isRelevant(eventForDeviceInfo2);
+ assertTrue("Irrelevant Device Event", result2);
+ assertEquals("Incorrect device map size", 2, ctrl.getDevicesMap().size());
+ reflectedDownListener.event(eventForDeviceInfo2);
+ assertEquals("Incorrect device map size", 1, ctrl.getDevicesMap().size());
+ }
+
+ /**
+ * Mock NetconfDeviceFactory class.
+ */
+ private class TestNetconfDeviceFactory implements NetconfDeviceFactory {
+
+ @Override
+ public NetconfDevice createNetconfDevice(NetconfDeviceInfo netconfDeviceInfo) throws NetconfException {
+ return new TestNetconfDevice(netconfDeviceInfo);
+ }
+ }
+
+ /**
+ * Mock NetconfDeviceImpl class, used for creating test devices.
+ */
+ protected class TestNetconfDevice implements NetconfDevice {
+ private NetconfDeviceInfo netconfDeviceInfo;
+ private boolean deviceState = false;
+ private NetconfSession netconfSession;
+
+ public TestNetconfDevice(NetconfDeviceInfo deviceInfo) throws NetconfException {
+ netconfDeviceInfo = deviceInfo;
+ if (!badDeviceInfo3.getDeviceId().equals(deviceInfo.getDeviceId())) {
+ netconfSession = EasyMock.createMock(NetconfSession.class);
+ deviceState = true;
+ } else {
+ throw new NetconfException("Cannot create Connection and Session");
+ }
+ }
+
+ @Override
+ public boolean isActive() {
+ return deviceState;
+ }
+
+ @Override
+ public NetconfSession getSession() {
+ return netconfSession;
+ }
+
+ @Override
+ public void disconnect() {
+ deviceState = false;
+ netconfSession = null;
+ }
+
+ @Override
+ public NetconfDeviceInfo getDeviceInfo() {
+ return netconfDeviceInfo;
+ }
+
+ }
+
+ private class MockComponentContext extends ComponentContextAdapter {
+ @Override
+ public Dictionary getProperties() {
+ return new MockDictionary();
+ }
+ }
+
+ private class MockDictionary extends Dictionary {
+
+ @Override
+ public int size() {
+ return 0;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return false;
+ }
+
+ @Override
+ public Enumeration keys() {
+ return null;
+ }
+
+ @Override
+ public Enumeration elements() {
+ return null;
+ }
+
+ @Override
+ public Object get(Object key) {
+ if (key.equals("netconfConnectTimeout")) {
+ return "2";
+ } else if (key.equals("netconfReplyTimeout")) {
+ return "1";
+ }
+ return null;
+ }
+
+ @Override
+ public Object put(Object key, Object value) {
+ return null;
+ }
+
+ @Override
+ public Object remove(Object key) {
+ return null;
+ }
+ }
+}