2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.impl.device;
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;
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.registry.flow.FlowDescriptorFactory;
75 import org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory;
76 import org.opendaylight.openflowplugin.impl.util.DeviceStateUtil;
77 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.ExperimenterMessageFromDev;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowRemovedBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Capabilities;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Error;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessageBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessageBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncReply;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketIn;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
110 import org.opendaylight.yangtools.concepts.Registration;
111 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
112 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
113 import org.opendaylight.yangtools.yang.binding.Notification;
114 import org.opendaylight.yangtools.yang.common.RpcResult;
115 import org.slf4j.Logger;
116 import org.slf4j.LoggerFactory;
118 @RunWith(MockitoJUnitRunner.class)
119 public class DeviceContextImplTest {
120 private static final Logger LOG = LoggerFactory
121 .getLogger(DeviceContextImplTest.class);
122 private static final short DUMMY_AUXILIARY_ID = 33;
123 private static final BigInteger DUMMY_COOKIE = new BigInteger("33");
124 private static final Long DUMMY_XID = 544L;
125 private static final Long DUMMY_PORT_NUMBER = 159L;
126 private static final BigInteger DUMMY_DATAPATH_ID = new BigInteger("55");
130 DeviceContext deviceContext;
132 TransactionChainManager txChainManager;
134 RequestContext<GetAsyncReply> requestContext;
136 RequestContext<MultipartReply> requestContextMultiReply;
138 ConnectionContext connectionContext;
140 DeviceState deviceState;
142 GetFeaturesOutput featuresOutput;
144 DataBroker dataBroker;
146 WriteTransaction wTx;
148 ReadOnlyTransaction rTx;
150 BindingTransactionChain txChainFactory;
152 HashedWheelTimer timer;
154 OutboundQueueProvider outboundQueueProvider;
156 ConnectionAdapter connectionAdapter;
157 NodeId nodeId = new NodeId("h2g2:42");
158 KeyedInstanceIdentifier<Node, NodeKey> nodeKeyIdent = DeviceStateUtil.createNodeInstanceIdentifier(nodeId);
160 TranslatorLibrary translatorLibrary;
162 Registration registration;
164 MessageTranslator messageTranslatorPacketReceived;
166 MessageTranslator messageTranslatorFlowCapableNodeConnector;
168 private MessageTranslator<Object, Object> messageTranslatorFlowRemoved;
170 private DeviceInfo deviceInfo;
172 private DeviceManager deviceManager;
174 private ConvertorExecutor convertorExecutor;
176 private MessageSpy messageSpy;
178 private InOrder inOrderDevState;
180 private final AtomicLong atomicLong = new AtomicLong(0);
182 private DeviceContext deviceContextSpy;
185 public void setUp() throws Exception{
186 final CheckedFuture<Optional<Node>, ReadFailedException> noExistNodeFuture = Futures.immediateCheckedFuture(Optional.<Node>absent());
187 Mockito.when(rTx.read(LogicalDatastoreType.OPERATIONAL, nodeKeyIdent)).thenReturn(noExistNodeFuture);
188 Mockito.when(dataBroker.newReadOnlyTransaction()).thenReturn(rTx);
189 Mockito.when(dataBroker.createTransactionChain(Mockito.any(TransactionChainManager.class))).thenReturn(txChainFactory);
190 Mockito.when(deviceInfo.getNodeInstanceIdentifier()).thenReturn(nodeKeyIdent);
191 Mockito.when(deviceInfo.getNodeId()).thenReturn(nodeId);
192 Mockito.when(deviceInfo.getDatapathId()).thenReturn(BigInteger.ONE);
193 final SettableFuture<RpcResult<GetAsyncReply>> settableFuture = SettableFuture.create();
194 final SettableFuture<RpcResult<MultipartReply>> settableFutureMultiReply = SettableFuture.create();
195 Mockito.when(requestContext.getFuture()).thenReturn(settableFuture);
196 Mockito.doAnswer(invocation -> {
197 settableFuture.set((RpcResult<GetAsyncReply>) invocation.getArguments()[0]);
199 }).when(requestContext).setResult(any(RpcResult.class));
201 Mockito.when(requestContextMultiReply.getFuture()).thenReturn(settableFutureMultiReply);
202 Mockito.doAnswer(invocation -> {
203 settableFutureMultiReply.set((RpcResult<MultipartReply>) invocation.getArguments()[0]);
205 }).when(requestContextMultiReply).setResult(any(RpcResult.class));
206 Mockito.when(txChainFactory.newWriteOnlyTransaction()).thenReturn(wTx);
207 Mockito.when(dataBroker.newReadOnlyTransaction()).thenReturn(rTx);
208 Mockito.when(connectionContext.getOutboundQueueProvider()).thenReturn(outboundQueueProvider);
209 Mockito.when(connectionContext.getConnectionAdapter()).thenReturn(connectionAdapter);
210 Mockito.when(connectionContext.getDeviceInfo()).thenReturn(deviceInfo);
211 final FeaturesReply mockedFeaturesReply = mock(FeaturesReply.class);
212 when(connectionContext.getFeatures()).thenReturn(mockedFeaturesReply);
213 when(connectionContext.getFeatures().getCapabilities()).thenReturn(mock(Capabilities.class));
215 Mockito.when(deviceInfo.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
216 Mockito.when(featuresOutput.getDatapathId()).thenReturn(DUMMY_DATAPATH_ID);
217 Mockito.when(featuresOutput.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
218 Mockito.when(messageTranslatorPacketReceived.translate(any(Object.class), any(DeviceInfo.class), any(Object.class))).thenReturn(mock(PacketReceived.class));
219 Mockito.when(messageTranslatorFlowCapableNodeConnector.translate(any(Object.class), any(DeviceInfo.class), any(Object.class))).thenReturn(mock(FlowCapableNodeConnector.class));
220 Mockito.when(translatorLibrary.lookupTranslator(eq(new TranslatorKey(OFConstants.OFP_VERSION_1_3, PacketIn.class.getName())))).thenReturn(messageTranslatorPacketReceived);
221 Mockito.when(translatorLibrary.lookupTranslator(eq(new TranslatorKey(OFConstants.OFP_VERSION_1_3, PortGrouping.class.getName())))).thenReturn(messageTranslatorFlowCapableNodeConnector);
222 Mockito.when(translatorLibrary.lookupTranslator(eq(new TranslatorKey(OFConstants.OFP_VERSION_1_3,
223 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemoved.class.getName()))))
224 .thenReturn(messageTranslatorFlowRemoved);
226 deviceContext = new DeviceContextImpl(
233 false, timer, deviceManager);
234 deviceContextSpy = Mockito.spy(deviceContext);
236 xid = new Xid(atomicLong.incrementAndGet());
237 xidMulti = new Xid(atomicLong.incrementAndGet());
238 ((DeviceContextImpl) deviceContext).lazyTransactionManagerInitialization();
240 Mockito.doNothing().when(deviceContextSpy).writeToTransaction(Mockito.<LogicalDatastoreType>any(), Mockito.<InstanceIdentifier>any(), any());
244 @Test(expected = NullPointerException.class)
245 public void testDeviceContextImplConstructorNullDataBroker() throws Exception {
246 new DeviceContextImpl(connectionContext, null, null, translatorLibrary, deviceManager, convertorExecutor,false, timer, deviceManager).close();
249 @Test(expected = NullPointerException.class)
250 public void testDeviceContextImplConstructorNullTimer() throws Exception {
251 new DeviceContextImpl(null, dataBroker, null, translatorLibrary, deviceManager,convertorExecutor,false, timer, deviceManager).close();
255 public void testGetReadTransaction() {
256 final ReadTransaction readTx = deviceContext.getReadTransaction();
257 assertNotNull(readTx);
258 assertEquals(rTx, readTx);
265 public void testInitialSubmitTransaction() throws Exception {
266 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
267 final InstanceIdentifier<Nodes> dummyII = InstanceIdentifier.create(Nodes.class);
268 ((DeviceContextImpl) deviceContext).getTransactionChainManager().activateTransactionManager() ;
269 ((DeviceContextImpl) deviceContext).getTransactionChainManager().enableSubmit();
270 deviceContext.addDeleteToTxChain(LogicalDatastoreType.CONFIGURATION, dummyII);
271 deviceContext.initialSubmitTransaction();
272 verify(wTx).submit();
276 public void testAuxiliaryConnectionContext() {
277 final ConnectionContext mockedConnectionContext = addDummyAuxiliaryConnectionContext();
278 final ConnectionContext pickedConnectiobContexts = deviceContext.getAuxiliaryConnectionContexts(DUMMY_COOKIE);
279 assertEquals(mockedConnectionContext, pickedConnectiobContexts);
282 public void testRemoveAuxiliaryConnectionContext() {
283 final ConnectionContext mockedConnectionContext = addDummyAuxiliaryConnectionContext();
285 final ConnectionAdapter mockedAuxConnectionAdapter = mock(ConnectionAdapter.class);
286 when(mockedConnectionContext.getConnectionAdapter()).thenReturn(mockedAuxConnectionAdapter);
288 assertNotNull(deviceContext.getAuxiliaryConnectionContexts(DUMMY_COOKIE));
289 deviceContext.removeAuxiliaryConnectionContext(mockedConnectionContext);
290 assertNull(deviceContext.getAuxiliaryConnectionContexts(DUMMY_COOKIE));
293 private ConnectionContext addDummyAuxiliaryConnectionContext() {
294 final ConnectionContext mockedConnectionContext = prepareConnectionContext();
295 deviceContext.addAuxiliaryConnectionContext(mockedConnectionContext);
296 return mockedConnectionContext;
299 private ConnectionContext prepareConnectionContext() {
300 final ConnectionContext mockedConnectionContext = mock(ConnectionContext.class);
301 final FeaturesReply mockedFeaturesReply = mock(FeaturesReply.class);
302 when(mockedFeaturesReply.getAuxiliaryId()).thenReturn(DUMMY_AUXILIARY_ID);
303 when(mockedConnectionContext.getFeatures()).thenReturn(mockedFeaturesReply);
304 return mockedConnectionContext;
311 public void testAddDeleteToTxChain() throws Exception{
312 final InstanceIdentifier<Nodes> dummyII = InstanceIdentifier.create(Nodes.class);
313 ((DeviceContextImpl) deviceContext).getTransactionChainManager().activateTransactionManager() ;
314 ((DeviceContextImpl) deviceContext).getTransactionChainManager().enableSubmit();
315 deviceContext.addDeleteToTxChain(LogicalDatastoreType.CONFIGURATION, dummyII);
316 verify(wTx).delete(eq(LogicalDatastoreType.CONFIGURATION), eq(dummyII));
323 public void testSubmitTransaction() throws Exception {
324 ((DeviceContextImpl) deviceContext).getTransactionChainManager().activateTransactionManager() ;
325 ((DeviceContextImpl) deviceContext).getTransactionChainManager().enableSubmit();
326 assertTrue(deviceContext.submitTransaction());
330 public void testGetPrimaryConnectionContext() {
331 final ConnectionContext primaryConnectionContext = deviceContext.getPrimaryConnectionContext();
332 assertEquals(connectionContext, primaryConnectionContext);
336 public void testGetDeviceFlowRegistry() {
337 final DeviceFlowRegistry deviceFlowRegistry = deviceContext.getDeviceFlowRegistry();
338 assertNotNull(deviceFlowRegistry);
342 public void testGetDeviceGroupRegistry() {
343 final DeviceGroupRegistry deviceGroupRegistry = deviceContext.getDeviceGroupRegistry();
344 assertNotNull(deviceGroupRegistry);
348 public void testGetDeviceMeterRegistry() {
349 final DeviceMeterRegistry deviceMeterRegistry = deviceContext.getDeviceMeterRegistry();
350 assertNotNull(deviceMeterRegistry);
354 public void testProcessReply() {
355 final Error mockedError = mock(Error.class);
356 deviceContext.processReply(mockedError);
357 verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_FAILURE));
358 final OfHeader mockedOfHeader = mock(OfHeader.class);
359 deviceContext.processReply(mockedOfHeader);
360 verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_SUCCESS));
364 public void testProcessReply2() {
365 final MultipartReply mockedMultipartReply = mock(MultipartReply.class);
366 final Xid dummyXid = new Xid(DUMMY_XID);
367 deviceContext.processReply(dummyXid, Lists.newArrayList(mockedMultipartReply));
368 verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_FAILURE));
372 public void testProcessPacketInMessageFutureSuccess() {
373 final PacketInMessage mockedPacketInMessage = mock(PacketInMessage.class);
374 final NotificationPublishService mockedNotificationPublishService = mock(NotificationPublishService.class);
375 final ListenableFuture stringListenableFuture = Futures.immediateFuture(new String("dummy value"));
377 when(mockedNotificationPublishService.offerNotification(any(PacketReceived.class))).thenReturn(stringListenableFuture);
378 deviceContext.setNotificationPublishService(mockedNotificationPublishService);
379 deviceContext.processPacketInMessage(mockedPacketInMessage);
380 verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_SUCCESS));
384 public void testProcessPacketInMessageFutureFailure() {
385 final PacketInMessage mockedPacketInMessage = mock(PacketInMessage.class);
386 final NotificationPublishService mockedNotificationPublishService = mock(NotificationPublishService.class);
387 final ListenableFuture dummyFuture = Futures.immediateFailedFuture(new IllegalStateException());
389 when(mockedNotificationPublishService.offerNotification(any(PacketReceived.class))).thenReturn(dummyFuture);
390 deviceContext.setNotificationPublishService(mockedNotificationPublishService);
391 deviceContext.processPacketInMessage(mockedPacketInMessage);
392 verify(messageSpy).spyMessage(any(Class.class), eq(MessageSpy.STATISTIC_GROUP.FROM_SWITCH_NOTIFICATION_REJECTED));
396 public void testTranslatorLibrary() {
397 final TranslatorLibrary pickedTranslatorLibrary = deviceContext.oook();
398 assertEquals(translatorLibrary, pickedTranslatorLibrary);
402 public void testShutdownConnection() {
403 final ConnectionAdapter mockedConnectionAdapter = mock(ConnectionAdapter.class);
404 final InetSocketAddress mockRemoteAddress = InetSocketAddress.createUnresolved("odl-unit.example.org",999);
405 when(mockedConnectionAdapter.getRemoteAddress()).thenReturn(mockRemoteAddress);
406 when(connectionContext.getConnectionAdapter()).thenReturn(mockedConnectionAdapter);
408 final NodeId dummyNodeId = new NodeId("dummyNodeId");
409 when(deviceInfo.getNodeId()).thenReturn(dummyNodeId);
411 final ConnectionContext mockedAuxiliaryConnectionContext = prepareConnectionContext();
412 deviceContext.addAuxiliaryConnectionContext(mockedAuxiliaryConnectionContext);
413 deviceContext.shutdownConnection();
414 verify(connectionContext).closeConnection(true);
418 public void testBarrierFieldSetGet() {
419 final Timeout mockedTimeout = mock(Timeout.class);
420 deviceContext.setCurrentBarrierTimeout(mockedTimeout);
421 final Timeout pickedBarrierTimeout = deviceContext.getBarrierTaskTimeout();
422 assertEquals(mockedTimeout, pickedBarrierTimeout);
426 public void testGetMessageSpy() {
427 final MessageSpy pickedMessageSpy = deviceContext.getMessageSpy();
428 assertEquals(messageSpy, pickedMessageSpy);
432 public void testOnPublished() {
433 final ConnectionContext auxiliaryConnectionContext = addDummyAuxiliaryConnectionContext();
435 final ConnectionAdapter mockedAuxConnectionAdapter = mock(ConnectionAdapter.class);
436 when(auxiliaryConnectionContext.getConnectionAdapter()).thenReturn(mockedAuxConnectionAdapter);
438 final ConnectionAdapter mockedConnectionAdapter = mock(ConnectionAdapter.class);
439 when(connectionContext.getConnectionAdapter()).thenReturn(mockedConnectionAdapter);
441 deviceContext.onPublished();
442 verify(mockedAuxConnectionAdapter).setPacketInFiltering(eq(false));
443 verify(mockedConnectionAdapter).setPacketInFiltering(eq(false));
447 public void testPortStatusMessage() throws Exception{
448 final PortStatusMessage mockedPortStatusMessage = mock(PortStatusMessage.class);
449 final Class dummyClass = Class.class;
450 when(mockedPortStatusMessage.getImplementedInterface()).thenReturn(dummyClass);
453 final GetFeaturesOutput mockedFeature = mock(GetFeaturesOutput.class);
454 when(mockedFeature.getDatapathId()).thenReturn(DUMMY_DATAPATH_ID);
456 when(mockedPortStatusMessage.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
457 when(mockedPortStatusMessage.getReason()).thenReturn(PortReason.OFPPRADD);
458 when(mockedPortStatusMessage.getPortNo()).thenReturn(42L);
460 deviceContextSpy.processPortStatusMessage(mockedPortStatusMessage);
461 verify(deviceContextSpy).writeToTransaction(Mockito.<LogicalDatastoreType>any(), Mockito.<InstanceIdentifier>any(), any());
462 verify(deviceContextSpy).submitTransaction();
466 public void testProcessFlowRemovedMessage() throws Exception {
467 // prepare translation result
468 final FlowRemovedBuilder flowRemovedMdsalBld = new FlowRemovedBuilder()
469 .setTableId((short) 0)
471 .setCookie(new FlowCookie(BigInteger.ONE))
472 .setMatch(new MatchBuilder().build());
473 final NotificationPublishService mockedNotificationPublishService = mock(NotificationPublishService.class);
475 Mockito.when(messageTranslatorFlowRemoved.translate(any(Object.class), any(DeviceInfo.class), any(Object.class)))
476 .thenReturn(flowRemovedMdsalBld.build());
478 // insert flow+flowId into local registry
479 final FlowRegistryKey flowRegKey = FlowRegistryKeyFactory.create(deviceInfo.getVersion(), flowRemovedMdsalBld.build());
480 final FlowDescriptor flowDescriptor = FlowDescriptorFactory.create((short) 0, new FlowId("ut-ofp:f456"));
481 deviceContext.getDeviceFlowRegistry().storeDescriptor(flowRegKey, flowDescriptor);
483 // plug in lifecycleListener
484 final ItemLifecycleListener itemLifecycleListener = Mockito.mock(ItemLifecycleListener.class);
485 for (final ItemLifeCycleSource lifeCycleSource : deviceContext.getItemLifeCycleSourceRegistry().getLifeCycleSources()) {
486 lifeCycleSource.setItemLifecycleListener(itemLifecycleListener);
489 // prepare empty input message
490 final FlowRemovedMessageBuilder flowRemovedBld = new FlowRemovedMessageBuilder();
492 // prepare path to flow to be removed
493 final KeyedInstanceIdentifier<Flow, FlowKey> flowToBeRemovedPath = nodeKeyIdent
494 .augmentation(FlowCapableNode.class)
495 .child(Table.class, new TableKey((short) 0))
496 .child(Flow.class, new FlowKey(new FlowId("ut-ofp:f456")));
498 Mockito.when(deviceManager.isFlowRemovedNotificationOn()).thenReturn(true);
500 deviceContext.setNotificationPublishService(mockedNotificationPublishService);
501 deviceContext.processFlowRemovedMessage(flowRemovedBld.build());
503 Mockito.verify(itemLifecycleListener).onRemoved(flowToBeRemovedPath);
505 Mockito.when(deviceManager.isFlowRemovedNotificationOn()).thenReturn(false);
506 deviceContext.processFlowRemovedMessage(flowRemovedBld.build());
508 Mockito.verify(mockedNotificationPublishService).offerNotification(Matchers.any(Notification.class));
512 public void testProcessExperimenterMessage() {
513 final ConvertorMessageFromOFJava mockedMessageConverter = mock(ConvertorMessageFromOFJava.class);
514 final ExtensionConverterProvider mockedExtensionConverterProvider = mock(ExtensionConverterProvider.class);
515 when(mockedExtensionConverterProvider.getMessageConverter(any(MessageTypeKey.class))).thenReturn(mockedMessageConverter);
517 final ExperimenterDataOfChoice mockedExperimenterDataOfChoice = mock(ExperimenterDataOfChoice.class);
518 final ExperimenterMessage experimenterMessage = new ExperimenterMessageBuilder()
519 .setExperimenterDataOfChoice(mockedExperimenterDataOfChoice).build();
521 final NotificationPublishService mockedNotificationPublishService = mock(NotificationPublishService.class);
523 deviceContext.setNotificationPublishService(mockedNotificationPublishService);
524 ((DeviceContextImpl) deviceContext).setExtensionConverterProvider(mockedExtensionConverterProvider);
525 deviceContext.processExperimenterMessage(experimenterMessage);
527 verify(mockedNotificationPublishService).offerNotification(any(ExperimenterMessageFromDev.class));
531 public void testOnDeviceDisconnected() throws Exception {
532 final DeviceTerminationPhaseHandler deviceContextClosedHandler = mock(DeviceTerminationPhaseHandler.class);
534 assertEquals(0, deviceContext.getDeviceFlowRegistry().size());
535 assertEquals(0, deviceContext.getDeviceGroupRegistry().size());
536 assertEquals(0, deviceContext.getDeviceMeterRegistry().size());
541 public void replaceConnectionContext() throws Exception {
543 final ConnectionContext connectionContext1 = mock(ConnectionContext.class);
544 Assert.assertEquals(deviceContext.getPrimaryConnectionContext(), connectionContext);
545 Mockito.when(connectionContext1.getConnectionAdapter()).thenReturn(connectionAdapter);
546 Mockito.doNothing().when(connectionAdapter).setPacketInFiltering(Mockito.anyBoolean());
547 deviceContext.replaceConnectionContext(connectionContext1);
548 Assert.assertEquals(deviceContext.getPrimaryConnectionContext(), connectionContext1);