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