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