e7efddeb350f1c31cf9887cb673b7e806a00283d
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / device / DeviceContextImplTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.openflowplugin.impl.device;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.mockito.Matchers.any;
15 import static org.mockito.Matchers.eq;
16 import static org.mockito.Mockito.mock;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.when;
19
20 import com.google.common.base.Optional;
21 import com.google.common.collect.Lists;
22 import com.google.common.util.concurrent.CheckedFuture;
23 import com.google.common.util.concurrent.Futures;
24 import com.google.common.util.concurrent.ListenableFuture;
25 import com.google.common.util.concurrent.SettableFuture;
26 import io.netty.util.HashedWheelTimer;
27 import io.netty.util.Timeout;
28 import java.math.BigInteger;
29 import java.util.concurrent.atomic.AtomicLong;
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.junit.runner.RunWith;
33 import org.mockito.InOrder;
34 import org.mockito.Matchers;
35 import org.mockito.Mock;
36 import org.mockito.Mockito;
37 import org.mockito.runners.MockitoJUnitRunner;
38 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
39 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
40 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
41 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
42 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
43 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
44 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
45 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
46 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
47 import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
48 import org.opendaylight.openflowplugin.api.OFConstants;
49 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
50 import org.opendaylight.openflowplugin.api.openflow.connection.OutboundQueueProvider;
51 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
52 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
53 import org.opendaylight.openflowplugin.api.openflow.device.DeviceManager;
54 import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator;
55 import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
56 import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary;
57 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
58 import org.opendaylight.openflowplugin.api.openflow.md.core.TranslatorKey;
59 import org.opendaylight.openflowplugin.api.openflow.registry.flow.DeviceFlowRegistry;
60 import org.opendaylight.openflowplugin.api.openflow.registry.flow.FlowDescriptor;
61 import org.opendaylight.openflowplugin.api.openflow.registry.flow.FlowRegistryKey;
62 import org.opendaylight.openflowplugin.api.openflow.registry.group.DeviceGroupRegistry;
63 import org.opendaylight.openflowplugin.api.openflow.registry.meter.DeviceMeterRegistry;
64 import org.opendaylight.openflowplugin.api.openflow.rpc.ItemLifeCycleSource;
65 import org.opendaylight.openflowplugin.api.openflow.rpc.listener.ItemLifecycleListener;
66 import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy;
67 import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava;
68 import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
69 import org.opendaylight.openflowplugin.impl.device.initialization.DeviceInitializerProviderFactory;
70 import org.opendaylight.openflowplugin.impl.registry.flow.FlowDescriptorFactory;
71 import org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory;
72 import org.opendaylight.openflowplugin.impl.util.DeviceStateUtil;
73 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.ExperimenterMessageFromDev;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowRemovedBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Capabilities;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Error;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessageBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessageBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncReply;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketIn;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
106 import org.opendaylight.yangtools.concepts.Registration;
107 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
108 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
109 import org.opendaylight.yangtools.yang.binding.Notification;
110 import org.opendaylight.yangtools.yang.common.RpcResult;
111 import org.slf4j.Logger;
112 import org.slf4j.LoggerFactory;
113
114 @RunWith(MockitoJUnitRunner.class)
115 public class DeviceContextImplTest {
116     private static final Logger LOG = LoggerFactory
117             .getLogger(DeviceContextImplTest.class);
118     private static final short DUMMY_AUXILIARY_ID = 33;
119     private static final BigInteger DUMMY_COOKIE = new BigInteger("33");
120     private static final Long DUMMY_XID = 544L;
121     private static final Long DUMMY_PORT_NUMBER = 159L;
122     private static final BigInteger DUMMY_DATAPATH_ID = new BigInteger("55");
123     Xid xid;
124     Xid xidMulti;
125
126     DeviceContext deviceContext;
127     @Mock
128     RequestContext<GetAsyncReply> requestContext;
129     @Mock
130     RequestContext<MultipartReply> requestContextMultiReply;
131     @Mock
132     ConnectionContext connectionContext;
133     @Mock
134     GetFeaturesOutput featuresOutput;
135     @Mock
136     DataBroker dataBroker;
137     @Mock
138     WriteTransaction wTx;
139     @Mock
140     ReadOnlyTransaction rTx;
141     @Mock
142     BindingTransactionChain txChainFactory;
143     @Mock
144     HashedWheelTimer timer;
145     @Mock
146     OutboundQueueProvider outboundQueueProvider;
147     @Mock
148     ConnectionAdapter connectionAdapter;
149     NodeId nodeId = new NodeId("h2g2:42");
150     KeyedInstanceIdentifier<Node, NodeKey> nodeKeyIdent = DeviceStateUtil.createNodeInstanceIdentifier(nodeId);
151     @Mock
152     TranslatorLibrary translatorLibrary;
153     @Mock
154     Registration registration;
155     @Mock
156     MessageTranslator messageTranslatorPacketReceived;
157     @Mock
158     MessageTranslator messageTranslatorFlowCapableNodeConnector;
159     @Mock
160     private MessageTranslator<Object, Object> messageTranslatorFlowRemoved;
161     @Mock
162     private DeviceInfo deviceInfo;
163     @Mock
164     private DeviceManager deviceManager;
165     @Mock
166     private ConvertorExecutor convertorExecutor;
167     @Mock
168     private MessageSpy messageSpy;
169
170     private InOrder inOrderDevState;
171
172     private final AtomicLong atomicLong = new AtomicLong(0);
173
174     private DeviceContext deviceContextSpy;
175
176     @Before
177     public void setUp() throws Exception{
178         final CheckedFuture<Optional<Node>, ReadFailedException> noExistNodeFuture = Futures.immediateCheckedFuture(Optional.<Node>absent());
179         Mockito.when(rTx.read(LogicalDatastoreType.OPERATIONAL, nodeKeyIdent)).thenReturn(noExistNodeFuture);
180         Mockito.when(dataBroker.newReadOnlyTransaction()).thenReturn(rTx);
181         Mockito.when(dataBroker.createTransactionChain(Mockito.any(TransactionChainManager.class))).thenReturn(txChainFactory);
182         Mockito.when(deviceInfo.getNodeInstanceIdentifier()).thenReturn(nodeKeyIdent);
183         Mockito.when(deviceInfo.getNodeId()).thenReturn(nodeId);
184         Mockito.when(deviceInfo.getDatapathId()).thenReturn(BigInteger.ONE);
185         final SettableFuture<RpcResult<GetAsyncReply>> settableFuture = SettableFuture.create();
186         final SettableFuture<RpcResult<MultipartReply>> settableFutureMultiReply = SettableFuture.create();
187         Mockito.when(requestContext.getFuture()).thenReturn(settableFuture);
188         Mockito.doAnswer(invocation -> {
189             settableFuture.set((RpcResult<GetAsyncReply>) invocation.getArguments()[0]);
190             return null;
191         }).when(requestContext).setResult(any(RpcResult.class));
192
193         Mockito.when(requestContextMultiReply.getFuture()).thenReturn(settableFutureMultiReply);
194         Mockito.doAnswer(invocation -> {
195             settableFutureMultiReply.set((RpcResult<MultipartReply>) invocation.getArguments()[0]);
196             return null;
197         }).when(requestContextMultiReply).setResult(any(RpcResult.class));
198         Mockito.when(txChainFactory.newWriteOnlyTransaction()).thenReturn(wTx);
199         Mockito.when(dataBroker.newReadOnlyTransaction()).thenReturn(rTx);
200         Mockito.when(connectionContext.getOutboundQueueProvider()).thenReturn(outboundQueueProvider);
201         Mockito.when(connectionContext.getConnectionAdapter()).thenReturn(connectionAdapter);
202         Mockito.when(connectionContext.getDeviceInfo()).thenReturn(deviceInfo);
203         final FeaturesReply mockedFeaturesReply = mock(FeaturesReply.class);
204         when(connectionContext.getFeatures()).thenReturn(mockedFeaturesReply);
205         when(connectionContext.getFeatures().getCapabilities()).thenReturn(mock(Capabilities.class));
206
207         Mockito.when(deviceInfo.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
208         Mockito.when(featuresOutput.getDatapathId()).thenReturn(DUMMY_DATAPATH_ID);
209         Mockito.when(featuresOutput.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
210         Mockito.when(messageTranslatorPacketReceived.translate(any(Object.class), any(DeviceInfo.class), any(Object.class))).thenReturn(mock(PacketReceived.class));
211         Mockito.when(messageTranslatorFlowCapableNodeConnector.translate(any(Object.class), any(DeviceInfo.class), any(Object.class))).thenReturn(mock(FlowCapableNodeConnector.class));
212         Mockito.when(translatorLibrary.lookupTranslator(eq(new TranslatorKey(OFConstants.OFP_VERSION_1_3, PacketIn.class.getName())))).thenReturn(messageTranslatorPacketReceived);
213         Mockito.when(translatorLibrary.lookupTranslator(eq(new TranslatorKey(OFConstants.OFP_VERSION_1_3, PortGrouping.class.getName())))).thenReturn(messageTranslatorFlowCapableNodeConnector);
214         Mockito.when(translatorLibrary.lookupTranslator(eq(new TranslatorKey(OFConstants.OFP_VERSION_1_3,
215                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemoved.class.getName()))))
216                 .thenReturn(messageTranslatorFlowRemoved);
217
218         deviceContext = new DeviceContextImpl(
219                 connectionContext,
220                 dataBroker,
221                 messageSpy,
222                 translatorLibrary,
223                 deviceManager,
224                 convertorExecutor,
225                 false, timer, false,
226             DeviceInitializerProviderFactory.createDefaultProvider());
227         ((DeviceContextImpl) deviceContext).lazyTransactionManagerInitialization();
228         deviceContextSpy = Mockito.spy(deviceContext);
229
230         xid = new Xid(atomicLong.incrementAndGet());
231         xidMulti = new Xid(atomicLong.incrementAndGet());
232
233         Mockito.doNothing().when(deviceContextSpy).writeToTransaction(any(), any(), any());
234
235     }
236
237     @Test
238     public void testGetReadTransaction() {
239         final ReadTransaction readTx = deviceContext.getReadTransaction();
240         assertNotNull(readTx);
241         assertEquals(rTx, readTx);
242     }
243
244     /**
245      * @throws Exception
246      */
247     @Test
248     public void testInitialSubmitTransaction() throws Exception {
249         Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
250         final InstanceIdentifier<Nodes> dummyII = InstanceIdentifier.create(Nodes.class);
251         ((DeviceContextImpl) deviceContext).getTransactionChainManager().activateTransactionManager() ;
252         ((DeviceContextImpl) deviceContext).getTransactionChainManager().enableSubmit();
253         deviceContext.addDeleteToTxChain(LogicalDatastoreType.CONFIGURATION, dummyII);
254         deviceContext.initialSubmitTransaction();
255         verify(wTx).submit();
256     }
257
258     private ConnectionContext prepareConnectionContext() {
259         final ConnectionContext mockedConnectionContext = mock(ConnectionContext.class);
260         final FeaturesReply mockedFeaturesReply = mock(FeaturesReply.class);
261         when(mockedFeaturesReply.getAuxiliaryId()).thenReturn(DUMMY_AUXILIARY_ID);
262         when(mockedConnectionContext.getFeatures()).thenReturn(mockedFeaturesReply);
263         return mockedConnectionContext;
264     }
265
266     /**
267      * @throws Exception
268      */
269     @Test
270     public void testAddDeleteToTxChain() throws Exception{
271         final InstanceIdentifier<Nodes> dummyII = InstanceIdentifier.create(Nodes.class);
272         ((DeviceContextImpl) deviceContext).getTransactionChainManager().activateTransactionManager() ;
273         ((DeviceContextImpl) deviceContext).getTransactionChainManager().enableSubmit();
274         deviceContext.addDeleteToTxChain(LogicalDatastoreType.CONFIGURATION, dummyII);
275         verify(wTx).delete(eq(LogicalDatastoreType.CONFIGURATION), eq(dummyII));
276     }
277
278     /**
279      * @throws Exception
280      */
281     @Test
282     public void testSubmitTransaction() throws Exception {
283         ((DeviceContextImpl) deviceContext).getTransactionChainManager().activateTransactionManager() ;
284         ((DeviceContextImpl) deviceContext).getTransactionChainManager().enableSubmit();
285         assertTrue(deviceContext.submitTransaction());
286     }
287
288     @Test
289     public void testGetPrimaryConnectionContext() {
290         final ConnectionContext primaryConnectionContext = deviceContext.getPrimaryConnectionContext();
291         assertEquals(connectionContext, primaryConnectionContext);
292     }
293
294     @Test
295     public void testGetDeviceFlowRegistry() {
296         final DeviceFlowRegistry deviceFlowRegistry = deviceContext.getDeviceFlowRegistry();
297         assertNotNull(deviceFlowRegistry);
298     }
299
300     @Test
301     public void testGetDeviceGroupRegistry() {
302         final DeviceGroupRegistry deviceGroupRegistry = deviceContext.getDeviceGroupRegistry();
303         assertNotNull(deviceGroupRegistry);
304     }
305
306     @Test
307     public void testGetDeviceMeterRegistry() {
308         final DeviceMeterRegistry deviceMeterRegistry = deviceContext.getDeviceMeterRegistry();
309         assertNotNull(deviceMeterRegistry);
310     }
311
312     @Test
313     public void testProcessReply() {
314         final Error mockedError = mock(Error.class);
315         deviceContext.processReply(mockedError);
316         verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.StatisticsGroup.FROM_SWITCH_PUBLISHED_FAILURE));
317         final OfHeader mockedOfHeader = mock(OfHeader.class);
318         deviceContext.processReply(mockedOfHeader);
319         verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.StatisticsGroup.FROM_SWITCH_PUBLISHED_SUCCESS));
320     }
321
322     @Test
323     public void testProcessReply2() {
324         final Xid dummyXid = new Xid(DUMMY_XID);
325
326         final Error mockedError = mock(Error.class);
327         deviceContext.processReply(dummyXid, Lists.newArrayList(mockedError));
328         verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.StatisticsGroup.FROM_SWITCH_PUBLISHED_FAILURE));
329
330         final MultipartReply mockedMultipartReply = mock(MultipartReply.class);
331         deviceContext.processReply(dummyXid, Lists.newArrayList(mockedMultipartReply));
332         verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.StatisticsGroup.FROM_SWITCH_PUBLISHED_SUCCESS));
333     }
334
335     @Test
336     public void testProcessPacketInMessageFutureSuccess() {
337         final PacketInMessage mockedPacketInMessage = mock(PacketInMessage.class);
338         final NotificationPublishService mockedNotificationPublishService = mock(NotificationPublishService.class);
339         final ListenableFuture stringListenableFuture = Futures.immediateFuture(new String("dummy value"));
340
341         when(mockedNotificationPublishService.offerNotification(any(PacketReceived.class))).thenReturn(stringListenableFuture);
342         deviceContext.setNotificationPublishService(mockedNotificationPublishService);
343         deviceContext.processPacketInMessage(mockedPacketInMessage);
344         verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.StatisticsGroup.FROM_SWITCH_PUBLISHED_SUCCESS));
345     }
346
347     @Test
348     public void testProcessPacketInMessageFutureFailure() {
349         final PacketInMessage mockedPacketInMessage = mock(PacketInMessage.class);
350         final NotificationPublishService mockedNotificationPublishService = mock(NotificationPublishService.class);
351         final ListenableFuture dummyFuture = Futures.immediateFailedFuture(new IllegalStateException());
352
353         when(mockedNotificationPublishService.offerNotification(any(PacketReceived.class))).thenReturn(dummyFuture);
354         deviceContext.setNotificationPublishService(mockedNotificationPublishService);
355         deviceContext.processPacketInMessage(mockedPacketInMessage);
356         verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.StatisticsGroup.FROM_SWITCH_NOTIFICATION_REJECTED));
357     }
358
359     @Test
360     public void testTranslatorLibrary() {
361         final TranslatorLibrary pickedTranslatorLibrary = deviceContext.oook();
362         assertEquals(translatorLibrary, pickedTranslatorLibrary);
363     }
364
365     @Test
366     public void testBarrierFieldSetGet() {
367         final Timeout mockedTimeout = mock(Timeout.class);
368         deviceContext.setCurrentBarrierTimeout(mockedTimeout);
369         final Timeout pickedBarrierTimeout = deviceContext.getBarrierTaskTimeout();
370         assertEquals(mockedTimeout, pickedBarrierTimeout);
371     }
372
373     @Test
374     public void testGetMessageSpy() {
375         final MessageSpy pickedMessageSpy = deviceContext.getMessageSpy();
376         assertEquals(messageSpy, pickedMessageSpy);
377     }
378
379     @Test
380     public void testOnPublished() {
381         final ConnectionAdapter mockedConnectionAdapter = mock(ConnectionAdapter.class);
382         when(connectionContext.getConnectionAdapter()).thenReturn(mockedConnectionAdapter);
383
384         deviceContext.onPublished();
385         verify(mockedConnectionAdapter).setPacketInFiltering(eq(false));
386     }
387
388     @Test
389     public void testPortStatusMessage() throws Exception{
390         final PortStatusMessage mockedPortStatusMessage = mock(PortStatusMessage.class);
391         final Class dummyClass = Class.class;
392         when(mockedPortStatusMessage.getImplementedInterface()).thenReturn(dummyClass);
393
394
395         final GetFeaturesOutput mockedFeature = mock(GetFeaturesOutput.class);
396         when(mockedFeature.getDatapathId()).thenReturn(DUMMY_DATAPATH_ID);
397
398         when(mockedPortStatusMessage.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
399         when(mockedPortStatusMessage.getReason()).thenReturn(PortReason.OFPPRADD);
400         when(mockedPortStatusMessage.getPortNo()).thenReturn(42L);
401
402         deviceContextSpy.processPortStatusMessage(mockedPortStatusMessage);
403         verify(messageSpy).spyMessage(any(), any());
404     }
405
406     @Test
407     public void testProcessFlowRemovedMessage() throws Exception {
408         // prepare translation result
409         final FlowRemovedBuilder flowRemovedMdsalBld = new FlowRemovedBuilder()
410                 .setTableId((short) 0)
411                 .setPriority(42)
412                 .setCookie(new FlowCookie(BigInteger.ONE))
413                 .setMatch(new MatchBuilder().build());
414         final NotificationPublishService mockedNotificationPublishService = mock(NotificationPublishService.class);
415
416         Mockito.when(messageTranslatorFlowRemoved.translate(any(Object.class), any(DeviceInfo.class), any(Object.class)))
417                 .thenReturn(flowRemovedMdsalBld.build());
418
419         // insert flow+flowId into local registry
420         final FlowRegistryKey flowRegKey = FlowRegistryKeyFactory.create(deviceInfo.getVersion(), flowRemovedMdsalBld.build());
421         final FlowDescriptor flowDescriptor = FlowDescriptorFactory.create((short) 0, new FlowId("ut-ofp:f456"));
422         deviceContext.getDeviceFlowRegistry().storeDescriptor(flowRegKey, flowDescriptor);
423
424         // plug in lifecycleListener
425         final ItemLifecycleListener itemLifecycleListener = Mockito.mock(ItemLifecycleListener.class);
426         for (final ItemLifeCycleSource lifeCycleSource : deviceContext.getItemLifeCycleSourceRegistry().getLifeCycleSources()) {
427             lifeCycleSource.setItemLifecycleListener(itemLifecycleListener);
428         }
429
430         // prepare empty input message
431         final FlowRemovedMessageBuilder flowRemovedBld = new FlowRemovedMessageBuilder();
432
433         // prepare path to flow to be removed
434         final KeyedInstanceIdentifier<Flow, FlowKey> flowToBeRemovedPath = nodeKeyIdent
435                 .augmentation(FlowCapableNode.class)
436                 .child(Table.class, new TableKey((short) 0))
437                 .child(Flow.class, new FlowKey(new FlowId("ut-ofp:f456")));
438
439         Mockito.when(deviceManager.isFlowRemovedNotificationOn()).thenReturn(true);
440
441         deviceContext.setNotificationPublishService(mockedNotificationPublishService);
442         deviceContext.processFlowRemovedMessage(flowRemovedBld.build());
443
444         Mockito.verify(itemLifecycleListener).onRemoved(flowToBeRemovedPath);
445
446         Mockito.when(deviceManager.isFlowRemovedNotificationOn()).thenReturn(false);
447         deviceContext.processFlowRemovedMessage(flowRemovedBld.build());
448
449         Mockito.verify(mockedNotificationPublishService).offerNotification(Matchers.any(Notification.class));
450     }
451
452     @Test
453     public void testProcessExperimenterMessage() {
454         final ConvertorMessageFromOFJava mockedMessageConverter = mock(ConvertorMessageFromOFJava.class);
455         final ExtensionConverterProvider mockedExtensionConverterProvider = mock(ExtensionConverterProvider.class);
456         when(mockedExtensionConverterProvider.getMessageConverter(any(MessageTypeKey.class))).thenReturn(mockedMessageConverter);
457
458         final ExperimenterDataOfChoice mockedExperimenterDataOfChoice = mock(ExperimenterDataOfChoice.class);
459         final ExperimenterMessage experimenterMessage = new ExperimenterMessageBuilder()
460                 .setExperimenterDataOfChoice(mockedExperimenterDataOfChoice).build();
461
462         final NotificationPublishService mockedNotificationPublishService = mock(NotificationPublishService.class);
463
464         deviceContext.setNotificationPublishService(mockedNotificationPublishService);
465         ((DeviceContextImpl) deviceContext).setExtensionConverterProvider(mockedExtensionConverterProvider);
466         deviceContext.processExperimenterMessage(experimenterMessage);
467
468         verify(mockedNotificationPublishService).offerNotification(any(ExperimenterMessageFromDev.class));
469     }
470
471 }