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