X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fservices%2FSalFlowServiceImplTest.java;h=8418e13ac8837cebd0b9b8faa6db7d1daf7b09a6;hb=501d4d64c806ad39e90b97def853fa043dda5f30;hp=d77aa5cd80256968639848bf67a7269c8416cc90;hpb=0b4b43cb55409bc1a6f8aa2be4bda5b05bd2a66e;p=openflowplugin.git diff --git a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/services/SalFlowServiceImplTest.java b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/services/SalFlowServiceImplTest.java index d77aa5cd80..8418e13ac8 100644 --- a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/services/SalFlowServiceImplTest.java +++ b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/services/SalFlowServiceImplTest.java @@ -1,9 +1,17 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. 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 + */ package org.opendaylight.openflowplugin.impl.services; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import com.google.common.util.concurrent.Futures; import java.math.BigInteger; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -20,6 +28,7 @@ import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; +import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; import org.opendaylight.openflowplugin.api.openflow.device.DeviceState; import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; @@ -29,6 +38,8 @@ import org.opendaylight.openflowplugin.api.openflow.registry.flow.FlowDescriptor import org.opendaylight.openflowplugin.api.openflow.registry.flow.FlowRegistryKey; import org.opendaylight.openflowplugin.api.openflow.rpc.listener.ItemLifecycleListener; import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table; @@ -36,10 +47,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; @@ -47,6 +64,7 @@ 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.protocol.rev130731.FeaturesReply; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; @@ -89,14 +107,20 @@ public class SalFlowServiceImplTest extends TestCase { private SalFlowServiceImpl salFlowService; @Mock - DeviceState mockedDeviceState; + private DeviceState mockedDeviceState; + @Mock + private DeviceInfo mockedDeviceInfo; @Mock private DeviceFlowRegistry deviceFlowRegistry; + @Mock + private GetFeaturesOutput mockedFeaturesOutput; @Before public void initialization() { when(mockedFeatures.getDatapathId()).thenReturn(DUMMY_DATAPATH_ID); when(mockedFeatures.getVersion()).thenReturn(DUMMY_VERSION); + when(mockedFeaturesOutput.getDatapathId()).thenReturn(DUMMY_DATAPATH_ID); + when(mockedFeaturesOutput.getVersion()).thenReturn(DUMMY_VERSION); when(mockedPrimConnectionContext.getFeatures()).thenReturn(mockedFeatures); when(mockedPrimConnectionContext.getConnectionAdapter()).thenReturn(mockedConnectionAdapter); @@ -111,11 +135,14 @@ public class SalFlowServiceImplTest extends TestCase { when(requestContext.getXid()).thenReturn(new Xid(84L)); when(requestContext.getFuture()).thenReturn(RpcResultBuilder.success().buildFuture()); - salFlowService = new SalFlowServiceImpl(mockedRequestContextStack, mockedDeviceContext); - - - when(mockedDeviceState.getNodeInstanceIdentifier()).thenReturn(NODE_II); + when(mockedDeviceInfo.getNodeInstanceIdentifier()).thenReturn(NODE_II); + when(mockedDeviceInfo.getDatapathId()).thenReturn(DUMMY_DATAPATH_ID); + when(mockedDeviceInfo.getVersion()).thenReturn(DUMMY_VERSION); when(mockedDeviceContext.getDeviceState()).thenReturn(mockedDeviceState); + when(mockedDeviceContext.getDeviceInfo()).thenReturn(mockedDeviceInfo); + + final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager(); + salFlowService = new SalFlowServiceImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager); } @Test @@ -123,15 +150,56 @@ public class SalFlowServiceImplTest extends TestCase { addFlow(null); } + @Test + public void testAddFlowFailCallback() throws Exception { + AddFlowInput mockedAddFlowInput = new AddFlowInputBuilder() + .setMatch(match) + .setTableId((short)1) + .build(); + + Mockito.doReturn(Futures.>immediateFailedFuture(new Exception("ut-failed-response"))) + .when(requestContext).getFuture(); + + mockingFlowRegistryLookup(); + final Future> rpcResultFuture = salFlowService.addFlow(mockedAddFlowInput); + + assertNotNull(rpcResultFuture); + final RpcResult addFlowOutputRpcResult = rpcResultFuture.get(); + assertNotNull(addFlowOutputRpcResult); + assertFalse(addFlowOutputRpcResult.isSuccessful()); + } + + @Test + public void testRemoveFlowFailCallback() throws Exception { + RemoveFlowInput mockedRemoveFlowInput = new RemoveFlowInputBuilder() + .setMatch(match) + .build(); + + Mockito.doReturn(Futures.>immediateFailedFuture(new Exception("ut-failed-response"))) + .when(requestContext).getFuture(); + + final Future> rpcResultFuture = salFlowService.removeFlow(mockedRemoveFlowInput); + + assertNotNull(rpcResultFuture); + final RpcResult removeFlowOutputRpcResult = rpcResultFuture.get(); + assertNotNull(removeFlowOutputRpcResult); + assertFalse(removeFlowOutputRpcResult.isSuccessful()); + } + @Test public void testAddFlowWithItemLifecycle() throws Exception { addFlow(mock(ItemLifecycleListener.class)); } private void addFlow(final ItemLifecycleListener itemLifecycleListener) throws ExecutionException, InterruptedException { - AddFlowInput mockedAddFlowInput = createFlowMock(AddFlowInput.class); + AddFlowInput mockedAddFlowInput = new AddFlowInputBuilder() + .setMatch(match) + .setTableId((short)1) + .build(); + salFlowService.setItemLifecycleListener(itemLifecycleListener); + mockingFlowRegistryLookup(); verifyOutput(salFlowService.addFlow(mockedAddFlowInput)); if (itemLifecycleListener != null) { Mockito.verify(itemLifecycleListener).onAdded(Matchers.>any(), Matchers.any()); @@ -149,7 +217,10 @@ public class SalFlowServiceImplTest extends TestCase { } private void removeFlow(final ItemLifecycleListener itemLifecycleListener) throws Exception { - RemoveFlowInput mockedRemoveFlowInput = createFlowMock(RemoveFlowInput.class); + RemoveFlowInput mockedRemoveFlowInput = new RemoveFlowInputBuilder() + .setMatch(match) + .setTableId((short)1) + .build(); if (itemLifecycleListener != null) { salFlowService.setItemLifecycleListener(itemLifecycleListener); @@ -177,14 +248,22 @@ public class SalFlowServiceImplTest extends TestCase { private void updateFlow(final ItemLifecycleListener itemLifecycleListener) throws Exception { UpdateFlowInput mockedUpdateFlowInput = mock(UpdateFlowInput.class); - UpdatedFlow mockedUpdateFlow = createFlowMock(UpdatedFlow.class); + UpdatedFlow mockedUpdateFlow = new UpdatedFlowBuilder() + .setMatch(match) + .setTableId((short)1) + .build(); + when(mockedUpdateFlowInput.getUpdatedFlow()).thenReturn(mockedUpdateFlow); FlowRef mockedFlowRef = mock(FlowRef.class); Mockito.doReturn(TABLE_II.child(Flow.class, new FlowKey(new FlowId(DUMMY_FLOW_ID)))).when(mockedFlowRef).getValue(); when(mockedUpdateFlowInput.getFlowRef()).thenReturn(mockedFlowRef); - OriginalFlow mockedOriginalFlow = createFlowMock(OriginalFlow.class); + OriginalFlow mockedOriginalFlow = new OriginalFlowBuilder() + .setMatch(match) + .setTableId((short)1) + .build(); + when(mockedUpdateFlowInput.getOriginalFlow()).thenReturn(mockedOriginalFlow); if (itemLifecycleListener != null) { @@ -195,18 +274,18 @@ public class SalFlowServiceImplTest extends TestCase { verifyOutput(salFlowService.updateFlow(mockedUpdateFlowInput)); if (itemLifecycleListener != null) { - Mockito.verify(itemLifecycleListener).onAdded(Matchers.>any(), Matchers.any()); - Mockito.verify(itemLifecycleListener).onRemoved(Matchers.>any()); + Mockito.verify(itemLifecycleListener).onUpdated(Matchers.>any(), Matchers.any()); } } private void mockingFlowRegistryLookup() { FlowDescriptor mockedFlowDescriptor = mock(FlowDescriptor.class); - when(mockedFlowDescriptor.getFlowId()).thenReturn(new FlowId(DUMMY_FLOW_ID)); + FlowId flowId = new FlowId(DUMMY_FLOW_ID); + when(mockedFlowDescriptor.getFlowId()).thenReturn(flowId); when(mockedFlowDescriptor.getTableKey()).thenReturn(new TableKey(DUMMY_TABLE_ID)); - when(deviceFlowRegistry.retrieveIdForFlow(Matchers.any(FlowRegistryKey.class))).thenReturn(mockedFlowDescriptor); + when(deviceFlowRegistry.retrieveDescriptor(Matchers.any(FlowRegistryKey.class))).thenReturn(mockedFlowDescriptor); } private void verifyOutput(Future> rpcResultFuture) throws ExecutionException, InterruptedException { @@ -215,10 +294,4 @@ public class SalFlowServiceImplTest extends TestCase { assertNotNull(addFlowOutputRpcResult); assertTrue(addFlowOutputRpcResult.isSuccessful()); } - - private T createFlowMock(Class flowClazz) { - T mockedFlow = mock(flowClazz); - when(mockedFlow.getMatch()).thenReturn(match); - return mockedFlow; - } -} \ No newline at end of file +}