Added unit test BridgeConfigurationManagerImpl.java 19/13719/3
authorMarcus Koontz <marcus.g.koontz@intel.com>
Tue, 9 Dec 2014 19:14:04 +0000 (11:14 -0800)
committerSam Hague <shague@redhat.com>
Sat, 31 Jan 2015 16:40:56 +0000 (11:40 -0500)
Patch Set 2: Added dependency for tests to pom.xml
Patch Set 3: Add review comments.

Change-Id: I8bc96fc2dee23e8d7f7b28cb033d6a25ca417297
Signed-off-by: Marcus Koontz <marcus.g.koontz@intel.com>
openstack/net-virt/pom.xml
openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/impl/BridgeConfigurationManagerImplTest.java [new file with mode: 0644]

index be7f6f0a0e3a23c5bf203358d5ec2acf3dffb29b..7fe2c74ef4c5469483fbaaa63338da1317cc4df1 100644 (file)
     <dependency>
       <groupId>org.opendaylight.ovsdb</groupId>
       <artifactId>utils.config</artifactId>
-      <version>${ovsdb.utils.config.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
     </dependency>
     <dependency>
       <groupId>junit</groupId>
diff --git a/openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/impl/BridgeConfigurationManagerImplTest.java b/openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/impl/BridgeConfigurationManagerImplTest.java
new file mode 100644 (file)
index 0000000..3c1b093
--- /dev/null
@@ -0,0 +1,396 @@
+/*
+* Copyright (c) 2014 Intel Corp. and others.  All rights reserved.
+*
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0 which accompanies this distribution,
+* and is available at http://www.eclipse.org/legal/epl-v10.html
+*
+* Authors : Marcus Koontz
+*/
+package org.opendaylight.ovsdb.openstack.netvirt.impl;
+
+import org.junit.runner.RunWith;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
+import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.ovsdb.lib.notation.Column;
+import org.opendaylight.ovsdb.lib.notation.Row;
+import org.opendaylight.ovsdb.lib.notation.UUID;
+import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
+import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
+import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
+import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
+import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
+import org.opendaylight.ovsdb.schema.openvswitch.Bridge;
+import org.opendaylight.ovsdb.schema.openvswitch.OpenVSwitch;
+import org.opendaylight.ovsdb.schema.openvswitch.Port;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.same;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.RETURNS_MOCKS;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BridgeConfigurationManagerImplTest {
+
+    private Node nodeMock = mock(Node.class, RETURNS_DEEP_STUBS);
+    private Bridge bridgeMock = mock(Bridge.class, RETURNS_DEEP_STUBS);
+
+    @Mock private OvsdbConfigurationService ovsdbConfigurationService;
+    @Mock private ConfigurationService configurationService;
+    @Mock private NetworkingProviderManager networkingProviderManager;
+
+
+    @InjectMocks public static BridgeConfigurationManagerImpl bridgeConfigurationManagerImpl;
+    @InjectMocks public static BridgeConfigurationManagerImpl bridgeConfigMock =
+            mock(BridgeConfigurationManagerImpl.class, RETURNS_DEEP_STUBS);
+    @Spy public static BridgeConfigurationManagerImpl bridgeConfigurationManagerImplSpy;
+
+    @Test
+    public void testGetBridgeUuid() throws Exception {
+        Row row = mock(Row.class);
+        Bridge bridge = mock(Bridge.class, RETURNS_DEEP_STUBS);
+
+        ConcurrentHashMap<String, Row> hashMap;
+        hashMap = new ConcurrentHashMap<>();
+        hashMap.put("mockUUID", row);
+
+        verifyNoMoreInteractions(ovsdbConfigurationService);
+        verifyNoMoreInteractions(configurationService);
+        verifyNoMoreInteractions(networkingProviderManager);
+
+        when(ovsdbConfigurationService.getRows(any(Node.class), anyString())).thenReturn(hashMap);
+        when(ovsdbConfigurationService.getTypedRow(any(Node.class), same(Bridge.class),
+                any(Row.class))).thenReturn(bridge);
+        when(bridge.getName()).thenReturn("test-bridge");
+
+        assertEquals("Error, did not return UUID of correct bridge", "mockUUID",
+                bridgeConfigurationManagerImpl.getBridgeUuid(nodeMock, "test-bridge"));
+
+        verify(ovsdbConfigurationService).getTableName(nodeMock, Bridge.class);
+        verifyNoMoreInteractions(configurationService);
+        verifyNoMoreInteractions(networkingProviderManager);
+    }
+
+    @Test
+    public void testIsNodeNeutronReady() throws Exception {
+        Row row = mock(Row.class);
+        Bridge bridge = mock(Bridge.class, RETURNS_DEEP_STUBS);
+
+        ConcurrentHashMap<String, Row> hashMap;
+        hashMap = new ConcurrentHashMap<>();
+        hashMap.put("mockUUID", row);
+
+        verifyNoMoreInteractions(ovsdbConfigurationService);
+        verifyNoMoreInteractions(configurationService);
+        verifyNoMoreInteractions(networkingProviderManager);
+
+        assertEquals("Error, did not return correct boolean from isNodeNeutronReady", false,
+                bridgeConfigurationManagerImpl.isNodeNeutronReady(nodeMock));
+
+        when(ovsdbConfigurationService.getRows(any(Node.class), anyString())).thenReturn(hashMap);
+        when(ovsdbConfigurationService.getTypedRow(any(Node.class), same(Bridge.class),
+                any(Row.class))).thenReturn(bridge);
+        when(bridge.getName()).thenReturn("test-bridge");
+        when(configurationService.getIntegrationBridgeName()).thenReturn("test-bridge");
+
+        assertEquals("Error, did not return correct boolean from isNodeNeutronReady", true,
+                bridgeConfigurationManagerImpl.isNodeNeutronReady(nodeMock));
+
+        verify(configurationService, times(2)).getIntegrationBridgeName();
+        verifyNoMoreInteractions(networkingProviderManager);
+    }
+
+    @Test
+    public void testIsNodeOverlayReady() throws Exception {
+        Row row = mock(Row.class);
+        Bridge bridge = mock(Bridge.class, RETURNS_DEEP_STUBS);
+
+        ConcurrentHashMap<String, Row> hashMap;
+        hashMap = new ConcurrentHashMap<>();
+        hashMap.put("mockUUID", row);
+
+        verifyNoMoreInteractions(ovsdbConfigurationService);
+        verifyNoMoreInteractions(configurationService);
+        verifyNoMoreInteractions(networkingProviderManager);
+
+        assertEquals("Error, did not return correct boolean from isNodeOverlayReady", false,
+                bridgeConfigurationManagerImpl.isNodeOverlayReady(nodeMock));
+
+        when(ovsdbConfigurationService.getRows(any(Node.class), anyString())).thenReturn(hashMap);
+        when(ovsdbConfigurationService.getTypedRow(any(Node.class), same(Bridge.class),
+                any(Row.class))).thenReturn(bridge);
+        when(bridge.getName()).thenReturn("test-bridge");
+        when(configurationService.getIntegrationBridgeName()).thenReturn("test-bridge");
+        when(configurationService.getNetworkBridgeName()).thenReturn("test-bridge");
+
+        assertEquals("Error, did not return correct boolean from isNodeOverlayReady", true,
+                bridgeConfigurationManagerImpl.isNodeOverlayReady(nodeMock));
+
+        verify(configurationService, times(2)).getIntegrationBridgeName();
+        verify(configurationService, times(1)).getNetworkBridgeName();
+        verify(ovsdbConfigurationService, times(3)).getTableName(nodeMock, Bridge.class);
+        verifyNoMoreInteractions(networkingProviderManager);
+    }
+
+    @Test
+    public void testIsPortOnBridge() throws Exception {
+        UUID uuid = mock(UUID.class);
+        Set<UUID> uuidSet = new HashSet<>();
+        uuidSet.add(uuid);
+        Column<GenericTableSchema, Set<UUID>> columnMock = mock(Column.class);
+        Port port = mock(Port.class, RETURNS_DEEP_STUBS);
+        String portName = "portNameMock";
+
+        verifyNoMoreInteractions(ovsdbConfigurationService);
+        verifyNoMoreInteractions(configurationService);
+        verifyNoMoreInteractions(networkingProviderManager);
+
+        when(bridgeMock.getPortsColumn()).thenReturn(columnMock);
+        when(columnMock.getData()).thenReturn(uuidSet);
+        assertEquals("Error, did not return correct boolean from isPortOnBridge", false,
+                bridgeConfigurationManagerImpl.isPortOnBridge(nodeMock, bridgeMock, portName));
+
+        when(port.getName()).thenReturn(portName);
+
+        when(ovsdbConfigurationService.getTypedRow(any(Node.class), any(Class.class), any(Row.class))).thenReturn(port);
+        when(port.getName()).thenReturn(portName);
+
+        assertEquals("Error, did not return correct boolean from isPortOnBridge", true,
+                bridgeConfigurationManagerImpl.isPortOnBridge(nodeMock, bridgeMock, portName));
+
+        verify(bridgeMock, times(2)).getPortsColumn();
+        verify(ovsdbConfigurationService, times(2)).getRow(any(Node.class), anyString(), anyString());
+        verify(ovsdbConfigurationService, times(2)).getTableName(any(Node.class), any(Class.class));
+        verify(ovsdbConfigurationService, times(2)).getTypedRow(any(Node.class), any(Class.class), any(Row.class));
+        verifyNoMoreInteractions(networkingProviderManager);
+        verifyNoMoreInteractions(configurationService);
+    }
+
+    @Test
+    public void testIsNodeTunnelReady() throws Exception {
+        String bridgeMockName = "BridgeMockName";
+
+        verifyNoMoreInteractions(ovsdbConfigurationService);
+        verifyNoMoreInteractions(configurationService);
+        verifyNoMoreInteractions(networkingProviderManager);
+
+        when(configurationService.getIntegrationBridgeName()).thenReturn(bridgeMockName);
+        // getBridge() is private method - cannot be mocked with mockito
+        // when(bridgeConfigurationManagerImpl.getBridge(any(Node.class), anyString())).thenReturn(bridgeMock);
+
+        // Negative testing only due to private method call
+        assertEquals("Error, did not return correct boolean from isNodeTunnelReady", false,
+                bridgeConfigurationManagerImpl.isNodeTunnelReady(nodeMock));
+
+        verify(configurationService, times(1)).getIntegrationBridgeName();
+        verify(networkingProviderManager, times(0)).getProvider(nodeMock);
+        verify(configurationService, times(0)).getNetworkBridgeName();
+        verify(ovsdbConfigurationService, times(1)).getRows(any(Node.class), anyString());
+        verify(ovsdbConfigurationService, times(1)).getTableName(any(Node.class), any(Class.class));
+        verify(ovsdbConfigurationService, times(0)).getTypedRow(any(Node.class), any(Class.class), any(Row.class));
+    }
+
+    @Test
+    public void testIsNodeVlanReady() throws Exception {
+        NeutronNetwork neutronNetworkMock = mock(NeutronNetwork.class);
+
+        verifyNoMoreInteractions(ovsdbConfigurationService);
+        verifyNoMoreInteractions(configurationService);
+        verifyNoMoreInteractions(networkingProviderManager);
+
+        // getBridge() is private method - cannot be mocked with mockito
+        // Negative testing only due to private method call
+        assertEquals("Error, did not return correct boolean from isNodeVlanReady", false,
+                bridgeConfigurationManagerImpl.isNodeVlanReady(nodeMock, neutronNetworkMock));
+
+        verify(configurationService, times(1)).getIntegrationBridgeName();
+        verify(networkingProviderManager, times(0)).getProvider(any(Node.class));
+        verify(configurationService, times(0)).getNetworkBridgeName();
+        verify(ovsdbConfigurationService, times(1)).getRows(any(Node.class), anyString());
+        verify(ovsdbConfigurationService, times(1)).getTableName(any(Node.class), any(Class.class));
+        verify(ovsdbConfigurationService, times(0)).getTypedRow(any(Node.class), any(Class.class), any(Row.class));
+        verify(neutronNetworkMock, times(0)).getProviderPhysicalNetwork();
+    }
+
+    @Test
+    public void testPrepareNode() throws Exception {
+        NetworkingProvider netProvider = mock(NetworkingProvider.class);
+        when(configurationService.getIntegrationBridgeName()).thenReturn("intBridgeName");
+        when(networkingProviderManager.getProvider(any(Node.class))).thenReturn(netProvider);
+
+        // createIntegrationBridge() is private method - cannot be mocked with mockito
+        // Negative testing only due to private method call
+        bridgeConfigurationManagerImpl.prepareNode(nodeMock);
+
+        verify(configurationService, times(1)).getIntegrationBridgeName();
+        verify(networkingProviderManager, times(0)).getProvider(any(Node.class));
+        verify(netProvider, times(0)).initializeFlowRules(any(Node.class));
+    }
+
+    @Test
+    public void testCreateLocalNetwork() throws Exception {
+        NeutronNetwork neutronNetworkMock = mock(NeutronNetwork.class, RETURNS_MOCKS);
+        String networkTypes[] = {"vlan", "vxlan", "gre"};
+
+        for (String networkType : networkTypes) {
+            when(neutronNetworkMock.getProviderNetworkType()).thenReturn(networkType);
+
+            doAnswer(new Answer<Boolean>() {
+                @Override
+                public Boolean answer(InvocationOnMock invocation) {
+                    return Boolean.TRUE;
+                }
+            }).when(bridgeConfigurationManagerImplSpy).isNodeVlanReady(any(Node.class), any(NeutronNetwork.class));
+
+            doAnswer(new Answer<Boolean>() {
+                @Override
+                public Boolean answer(InvocationOnMock invocation) {
+                    return Boolean.TRUE;
+                }
+            }).when(bridgeConfigurationManagerImplSpy).isNodeTunnelReady(any(Node.class));
+
+            assertTrue("bridgeConfigMock.isNodeVlanReady is not true",
+                    bridgeConfigurationManagerImplSpy.isNodeVlanReady(nodeMock, neutronNetworkMock));
+            assertTrue("bridgeConfigMock.isNodeTunnelReady is not true",
+                    bridgeConfigurationManagerImplSpy.isNodeTunnelReady(nodeMock));
+
+            assertTrue("Error, isCreated is not true for " + networkType,
+                    bridgeConfigurationManagerImplSpy.createLocalNetwork(nodeMock, neutronNetworkMock));
+            if (networkType == "vlan") {
+                verify(neutronNetworkMock, times(1)).getProviderNetworkType();
+            } else if (networkType == "vxlan") {
+                verify(neutronNetworkMock, times(2)).getProviderNetworkType();
+            } else if (networkType == "gre") {
+                verify(neutronNetworkMock, times(3)).getProviderNetworkType();
+            }
+            reset(neutronNetworkMock);
+            reset(nodeMock);
+            reset(bridgeConfigurationManagerImplSpy);
+        }
+    }
+
+    @Test
+    public void testGetPhysicalInterfaceName() throws Exception {
+        ConcurrentHashMap ovsTable = mock(ConcurrentHashMap.class, RETURNS_DEEP_STUBS);
+        Row row = mock(Row.class);
+        OpenVSwitch ovsRowOVS = mock(OpenVSwitch.class);
+        Column<GenericTableSchema, Map<String, String>> col = mock(Column.class);
+        Map<String, String> colMap = mock(Map.class);
+
+        HashMap<String, OpenVSwitch> hashMapOVS = new HashMap<>();
+        hashMapOVS.put("ovsRow", ovsRowOVS);
+        ConcurrentHashMap<String, Row> hashMap;
+        hashMap = new ConcurrentHashMap<>();
+        hashMap.put("row1", row);
+
+        String networkNames[] = {"network-0", "network-1", "network-2", "network-3"};
+        String interfaceNames[] = {"interfaceName-0", "interfaceName-1", "interfaceName-2", "interfaceName-3"};
+        int count = 0;
+
+        for (String networkName : networkNames) {
+            when(ovsdbConfigurationService.getRows(any(Node.class), anyString())).thenReturn(hashMap);
+            when(ovsTable.values()).thenReturn(hashMapOVS.values());
+
+            when(ovsRowOVS.getOtherConfigColumn()).thenReturn(col);
+            when(col.getData()).thenReturn(colMap);
+            when(configurationService.getProviderMappingsKey()).thenReturn("network-0:interfaceName-0," +
+                    "network-1:interfaceName-1,network-2:interfaceName-2,network-3:interfaceName-3");
+            when(colMap.get(anyString())).thenReturn("network-0:interfaceName-0,network-1:interfaceName-1," +
+                    "network-2:interfaceName-2,network-3:interfaceName-3");
+
+            when(configurationService.getDefaultProviderMapping()).thenReturn("network-0:interfaceName-0," +
+                    "network-1:interfaceName-1,network-2:interfaceName-2,network-3:interfaceName-3");
+
+            when(ovsdbConfigurationService.getTypedRow(any(Node.class), same(OpenVSwitch.class),
+                    any(Row.class))).thenReturn(ovsRowOVS);
+
+            assertEquals("Error, network: " + networkName + ", did not match interface: " + interfaceNames[count],
+                    interfaceNames[count], bridgeConfigurationManagerImpl.getPhysicalInterfaceName(nodeMock,
+                            networkName));
+
+            verify(ovsdbConfigurationService, times(count + 1)).getRows(any(Node.class), anyString());
+            verify(ovsdbConfigurationService, times(count + 1)).getTableName(any(Node.class), any(Class.class));
+            verify(ovsdbConfigurationService, times(count + 1)).getTypedRow(any(Node.class), any(Class.class),
+                    any(Row.class));
+            verify(configurationService, times(count + 1)).getProviderMappingsKey();
+            verify(configurationService, times(0)).getDefaultProviderMapping();
+            count++;
+        }
+    }
+
+    @Test
+    public void testGetAllPhysicalInterfaceNames() throws Exception {
+        String interfaceNames[] = {"interfaceName-0", "interfaceName-1", "interfaceName-2", "interfaceName-3"};
+        List<String> intNameList = new ArrayList<>();
+        for (String name: interfaceNames){
+            intNameList.add(name);
+        }
+        Row row = mock(Row.class);
+        OpenVSwitch ovsRowOVS = mock(OpenVSwitch.class);
+        Column<GenericTableSchema, Map<String, String>> col = mock(Column.class);
+        Map<String, String> colMap = mock(Map.class);
+        ConcurrentHashMap<String, Row> hashMap;
+        hashMap = new ConcurrentHashMap<>();
+        hashMap.put("row1", row);
+
+        when(ovsdbConfigurationService.getRows(any(Node.class), anyString())).thenReturn(hashMap);
+        when(ovsdbConfigurationService.getTypedRow(any(Node.class), same(OpenVSwitch.class),
+                any(Row.class))).thenReturn(ovsRowOVS);
+        when(ovsRowOVS.getOtherConfigColumn()).thenReturn(col);
+        when(col.getData()).thenReturn(colMap);
+        when(colMap.get(anyString())).thenReturn("network-0:interfaceName-0,network-1:interfaceName-1," +
+                "network-2:interfaceName-2,network-3:interfaceName-3");
+
+        assertEquals("Error, did not get all interface names", intNameList,
+                bridgeConfigurationManagerImpl.getAllPhysicalInterfaceNames(nodeMock));
+        verify(ovsdbConfigurationService, times(1)).getRows(any(Node.class), anyString());
+        verify(ovsdbConfigurationService, times(1)).getTableName(any(Node.class), any(Class.class));
+        verify(ovsdbConfigurationService, times(1)).getTypedRow(any(Node.class), any(Class.class), any(Row.class));
+        verify(configurationService, times(1)).getProviderMappingsKey();
+        verify(configurationService, times(0)).getDefaultProviderMapping();
+    }
+
+    @Test
+    public void testGetBridge() throws Exception {
+        Row row = mock(Row.class);
+        Bridge bridge = mock(Bridge.class);
+        ConcurrentHashMap<String, Row> hashMap;
+        hashMap = new ConcurrentHashMap<>();
+        hashMap.put("row1", row);
+
+        when(ovsdbConfigurationService.getRows(any(Node.class), anyString())).thenReturn(hashMap);
+        when(ovsdbConfigurationService.getTypedRow(any(Node.class), same(Bridge.class),
+                any(Row.class))).thenReturn(bridge);
+        when(bridge.getName()).thenReturn("test-bridge");
+
+        assertEquals("Error, did not get correct bridge", bridge,
+                bridgeConfigurationManagerImpl.getBridge(nodeMock, "test-bridge"));
+        verify(ovsdbConfigurationService, times(1)).getRows(any(Node.class), anyString());
+        verify(ovsdbConfigurationService, times(1)).getTableName(any(Node.class), any(Class.class));
+        verify(ovsdbConfigurationService, times(1)).getTypedRow(any(Node.class), any(Class.class), any(Row.class));
+    }
+}
\ No newline at end of file