X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fdevice%2FDeviceContextImplTest.java;h=95e454a98001f6ade7afd1aa346a28c2363d84a5;hb=501d4d64c806ad39e90b97def853fa043dda5f30;hp=aa8b1d13ab7cab3178aaab7a8576d4541c4b77eb;hpb=592b139164e52983ae19ea67443938273785d2ab;p=openflowplugin.git diff --git a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImplTest.java b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImplTest.java index aa8b1d13ab..95e454a980 100644 --- a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImplTest.java +++ b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImplTest.java @@ -16,7 +16,6 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import com.google.common.base.Optional; @@ -35,9 +34,9 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; +import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -54,14 +53,13 @@ import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext import org.opendaylight.openflowplugin.api.openflow.connection.OutboundQueueProvider; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; +import org.opendaylight.openflowplugin.api.openflow.device.DeviceManager; import org.opendaylight.openflowplugin.api.openflow.device.DeviceState; import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator; import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary; -import org.opendaylight.openflowplugin.api.openflow.device.TxFacade; import org.opendaylight.openflowplugin.api.openflow.device.Xid; import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceTerminationPhaseHandler; -import org.opendaylight.openflowplugin.api.openflow.lifecycle.LifecycleConductor; import org.opendaylight.openflowplugin.api.openflow.md.core.TranslatorKey; import org.opendaylight.openflowplugin.api.openflow.registry.flow.DeviceFlowRegistry; import org.opendaylight.openflowplugin.api.openflow.registry.flow.FlowDescriptor; @@ -69,17 +67,14 @@ import org.opendaylight.openflowplugin.api.openflow.registry.flow.FlowRegistryKe import org.opendaylight.openflowplugin.api.openflow.registry.group.DeviceGroupRegistry; import org.opendaylight.openflowplugin.api.openflow.registry.meter.DeviceMeterRegistry; import org.opendaylight.openflowplugin.api.openflow.rpc.ItemLifeCycleSource; -import org.opendaylight.openflowplugin.api.openflow.rpc.RpcContext; import org.opendaylight.openflowplugin.api.openflow.rpc.listener.ItemLifecycleListener; -import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsContext; -import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageIntelligenceAgency; import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava; import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider; import org.opendaylight.openflowplugin.impl.registry.flow.FlowDescriptorFactory; import org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory; import org.opendaylight.openflowplugin.impl.util.DeviceStateUtil; -import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor; import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.ExperimenterMessageFromDev; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; @@ -91,22 +86,31 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowRemovedBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Capabilities; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.*; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Error; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessageBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessageBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncReply; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived; -import org.opendaylight.yang.gen.v1.urn.opendaylight.role.service.rev150727.OfpRole; import org.opendaylight.yangtools.concepts.Registration; -import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -147,8 +151,6 @@ public class DeviceContextImplTest { @Mock HashedWheelTimer timer; @Mock - MessageIntelligenceAgency messageIntelligenceAgency; - @Mock OutboundQueueProvider outboundQueueProvider; @Mock ConnectionAdapter connectionAdapter; @@ -165,9 +167,13 @@ public class DeviceContextImplTest { @Mock private MessageTranslator messageTranslatorFlowRemoved; @Mock - private LifecycleConductor lifecycleConductor; - @Mock private DeviceInfo deviceInfo; + @Mock + private DeviceManager deviceManager; + @Mock + private ConvertorExecutor convertorExecutor; + @Mock + private MessageSpy messageSpy; private InOrder inOrderDevState; @@ -216,37 +222,33 @@ public class DeviceContextImplTest { Mockito.when(translatorLibrary.lookupTranslator(eq(new TranslatorKey(OFConstants.OFP_VERSION_1_3, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemoved.class.getName())))) .thenReturn(messageTranslatorFlowRemoved); - Mockito.when(lifecycleConductor.getMessageIntelligenceAgency()).thenReturn(messageIntelligenceAgency); - deviceContext = new DeviceContextImpl(connectionContext, deviceState, dataBroker, lifecycleConductor, outboundQueueProvider, translatorLibrary, false); + deviceContext = new DeviceContextImpl( + connectionContext, + dataBroker, + messageSpy, + translatorLibrary, + deviceManager, + convertorExecutor, + false, timer, deviceManager); deviceContextSpy = Mockito.spy(deviceContext); xid = new Xid(atomicLong.incrementAndGet()); xidMulti = new Xid(atomicLong.incrementAndGet()); + ((DeviceContextImpl) deviceContext).lazyTransactionManagerInitialization(); Mockito.doNothing().when(deviceContextSpy).writeToTransaction(Mockito.any(), Mockito.any(), any()); - } - @Test(expected = NullPointerException.class) - public void testDeviceContextImplConstructorNullDataBroker() throws Exception { - new DeviceContextImpl(connectionContext, deviceState, null, lifecycleConductor, outboundQueueProvider, translatorLibrary, false).close(); } @Test(expected = NullPointerException.class) - public void testDeviceContextImplConstructorNullDeviceState() throws Exception { - new DeviceContextImpl(connectionContext, null, dataBroker, lifecycleConductor, outboundQueueProvider, translatorLibrary, false).close(); + public void testDeviceContextImplConstructorNullDataBroker() throws Exception { + new DeviceContextImpl(connectionContext, null, null, translatorLibrary, deviceManager, convertorExecutor,false, timer, deviceManager).close(); } @Test(expected = NullPointerException.class) public void testDeviceContextImplConstructorNullTimer() throws Exception { - new DeviceContextImpl(null, deviceState, dataBroker, lifecycleConductor, outboundQueueProvider, translatorLibrary, false).close(); - } - - @Test - public void testGetDeviceState() { - final DeviceState deviceSt = deviceContext.getDeviceState(); - assertNotNull(deviceSt); - assertEquals(deviceState, deviceSt); + new DeviceContextImpl(null, dataBroker, null, translatorLibrary, deviceManager,convertorExecutor,false, timer, deviceManager).close(); } @Test @@ -266,20 +268,14 @@ public class DeviceContextImplTest { ((DeviceContextImpl) deviceContext).getTransactionChainManager().activateTransactionManager() ; ((DeviceContextImpl) deviceContext).getTransactionChainManager().enableSubmit(); deviceContext.addDeleteToTxChain(LogicalDatastoreType.CONFIGURATION, dummyII); - ((DeviceContextImpl) deviceContext).initialSubmitTransaction(); + deviceContext.initialSubmitTransaction(); verify(wTx).submit(); } - @Test - public void testGetReservedXid() { - deviceContext.reserveXidForDeviceMessage(); - verify(outboundQueueProvider).reserveEntry(); - } - @Test public void testAuxiliaryConnectionContext() { final ConnectionContext mockedConnectionContext = addDummyAuxiliaryConnectionContext(); - final ConnectionContext pickedConnectiobContexts = deviceContext.getAuxiliaryConnectiobContexts(DUMMY_COOKIE); + final ConnectionContext pickedConnectiobContexts = deviceContext.getAuxiliaryConnectionContexts(DUMMY_COOKIE); assertEquals(mockedConnectionContext, pickedConnectiobContexts); } @Test @@ -289,9 +285,9 @@ public class DeviceContextImplTest { final ConnectionAdapter mockedAuxConnectionAdapter = mock(ConnectionAdapter.class); when(mockedConnectionContext.getConnectionAdapter()).thenReturn(mockedAuxConnectionAdapter); - assertNotNull(deviceContext.getAuxiliaryConnectiobContexts(DUMMY_COOKIE)); + assertNotNull(deviceContext.getAuxiliaryConnectionContexts(DUMMY_COOKIE)); deviceContext.removeAuxiliaryConnectionContext(mockedConnectionContext); - assertNull(deviceContext.getAuxiliaryConnectiobContexts(DUMMY_COOKIE)); + assertNull(deviceContext.getAuxiliaryConnectionContexts(DUMMY_COOKIE)); } private ConnectionContext addDummyAuxiliaryConnectionContext() { @@ -358,10 +354,10 @@ public class DeviceContextImplTest { public void testProcessReply() { final Error mockedError = mock(Error.class); deviceContext.processReply(mockedError); - verify(messageIntelligenceAgency).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_FAILURE)); + verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_FAILURE)); final OfHeader mockedOfHeader = mock(OfHeader.class); deviceContext.processReply(mockedOfHeader); - verify(messageIntelligenceAgency).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_SUCCESS)); + verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_SUCCESS)); } @Test @@ -369,7 +365,7 @@ public class DeviceContextImplTest { final MultipartReply mockedMultipartReply = mock(MultipartReply.class); final Xid dummyXid = new Xid(DUMMY_XID); deviceContext.processReply(dummyXid, Lists.newArrayList(mockedMultipartReply)); - verify(messageIntelligenceAgency).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_FAILURE)); + verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_FAILURE)); } @Test @@ -381,7 +377,7 @@ public class DeviceContextImplTest { when(mockedNotificationPublishService.offerNotification(any(PacketReceived.class))).thenReturn(stringListenableFuture); deviceContext.setNotificationPublishService(mockedNotificationPublishService); deviceContext.processPacketInMessage(mockedPacketInMessage); - verify(messageIntelligenceAgency).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_SUCCESS)); + verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_SUCCESS)); } @Test @@ -393,7 +389,7 @@ public class DeviceContextImplTest { when(mockedNotificationPublishService.offerNotification(any(PacketReceived.class))).thenReturn(dummyFuture); deviceContext.setNotificationPublishService(mockedNotificationPublishService); deviceContext.processPacketInMessage(mockedPacketInMessage); - verify(messageIntelligenceAgency).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_NOTIFICATION_REJECTED)); + verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_NOTIFICATION_REJECTED)); } @Test @@ -414,8 +410,6 @@ public class DeviceContextImplTest { final ConnectionContext mockedAuxiliaryConnectionContext = prepareConnectionContext(); deviceContext.addAuxiliaryConnectionContext(mockedAuxiliaryConnectionContext); - final DeviceTerminationPhaseHandler mockedDeviceContextClosedHandler = mock(DeviceTerminationPhaseHandler.class); - when(deviceState.isValid()).thenReturn(true); deviceContext.shutdownConnection(); verify(connectionContext).closeConnection(true); } @@ -431,16 +425,7 @@ public class DeviceContextImplTest { @Test public void testGetMessageSpy() { final MessageSpy pickedMessageSpy = deviceContext.getMessageSpy(); - assertEquals(messageIntelligenceAgency, pickedMessageSpy); - } - - @Test - public void testNodeConnector() { - final NodeConnectorRef mockedNodeConnectorRef = mock(NodeConnectorRef.class); - deviceContext.storeNodeConnectorRef(DUMMY_PORT_NUMBER, mockedNodeConnectorRef); - final NodeConnectorRef nodeConnectorRef = deviceContext.lookupNodeConnectorRef(DUMMY_PORT_NUMBER); - assertEquals(mockedNodeConnectorRef, nodeConnectorRef); - + assertEquals(messageSpy, pickedMessageSpy); } @Test @@ -472,7 +457,6 @@ public class DeviceContextImplTest { when(mockedPortStatusMessage.getReason()).thenReturn(PortReason.OFPPRADD); when(mockedPortStatusMessage.getPortNo()).thenReturn(42L); - OpenflowPortsUtil.init(); deviceContextSpy.processPortStatusMessage(mockedPortStatusMessage); verify(deviceContextSpy).writeToTransaction(Mockito.any(), Mockito.any(), any()); verify(deviceContextSpy).submitTransaction(); @@ -492,9 +476,9 @@ public class DeviceContextImplTest { .thenReturn(flowRemovedMdsalBld.build()); // insert flow+flowId into local registry - final FlowRegistryKey flowRegKey = FlowRegistryKeyFactory.create(flowRemovedMdsalBld.build()); + final FlowRegistryKey flowRegKey = FlowRegistryKeyFactory.create(deviceInfo.getVersion(), flowRemovedMdsalBld.build()); final FlowDescriptor flowDescriptor = FlowDescriptorFactory.create((short) 0, new FlowId("ut-ofp:f456")); - deviceContext.getDeviceFlowRegistry().store(flowRegKey, flowDescriptor); + deviceContext.getDeviceFlowRegistry().storeDescriptor(flowRegKey, flowDescriptor); // plug in lifecycleListener final ItemLifecycleListener itemLifecycleListener = Mockito.mock(ItemLifecycleListener.class); @@ -511,9 +495,17 @@ public class DeviceContextImplTest { .child(Table.class, new TableKey((short) 0)) .child(Flow.class, new FlowKey(new FlowId("ut-ofp:f456"))); + Mockito.when(deviceManager.isFlowRemovedNotificationOn()).thenReturn(true); + deviceContext.setNotificationPublishService(mockedNotificationPublishService); deviceContext.processFlowRemovedMessage(flowRemovedBld.build()); + Mockito.verify(itemLifecycleListener).onRemoved(flowToBeRemovedPath); + + Mockito.when(deviceManager.isFlowRemovedNotificationOn()).thenReturn(false); + deviceContext.processFlowRemovedMessage(flowRemovedBld.build()); + + Mockito.verify(mockedNotificationPublishService).offerNotification(Matchers.any(Notification.class)); } @Test @@ -539,27 +531,22 @@ public class DeviceContextImplTest { public void testOnDeviceDisconnected() throws Exception { final DeviceTerminationPhaseHandler deviceContextClosedHandler = mock(DeviceTerminationPhaseHandler.class); - assertEquals(0, deviceContext.getDeviceFlowRegistry().getAllFlowDescriptors().size()); - assertEquals(0, deviceContext.getDeviceGroupRegistry().getAllGroupIds().size()); - assertEquals(0, deviceContext.getDeviceMeterRegistry().getAllMeterIds().size()); + assertEquals(0, deviceContext.getDeviceFlowRegistry().size()); + assertEquals(0, deviceContext.getDeviceGroupRegistry().size()); + assertEquals(0, deviceContext.getDeviceMeterRegistry().size()); } @Test - public void testOnClusterRoleChange() throws Exception { - - // test call transactionChainManager.deactivateTransactionManager() - Assert.assertNull(deviceContextSpy.onClusterRoleChange(OfpRole.NOCHANGE).get()); - - Assert.assertNull(deviceContextSpy.onClusterRoleChange(OfpRole.NOCHANGE).get()); + public void replaceConnectionContext() throws Exception { - final StatisticsContext statisticsContext = mock(StatisticsContext.class); - deviceContextSpy.setStatisticsContext(statisticsContext); + final ConnectionContext connectionContext1 = mock(ConnectionContext.class); + Assert.assertEquals(deviceContext.getPrimaryConnectionContext(), connectionContext); + Mockito.when(connectionContext1.getConnectionAdapter()).thenReturn(connectionAdapter); + Mockito.doNothing().when(connectionAdapter).setPacketInFiltering(Mockito.anyBoolean()); + deviceContext.replaceConnectionContext(connectionContext1); + Assert.assertEquals(deviceContext.getPrimaryConnectionContext(), connectionContext1); - deviceContextSpy.onClusterRoleChange(OfpRole.BECOMEMASTER); - verify(deviceContextSpy).onDeviceTakeClusterLeadership(); - - Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null)); - deviceContextSpy.onClusterRoleChange(OfpRole.BECOMESLAVE); } + }