Coverage - DeviceManagerImpl.
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / device / DeviceManagerImplTest.java
1 /*
2  *
3  *  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
4  *  *
5  *  * This program and the accompanying materials are made available under the
6  *  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
7  *  * and is available at http://www.eclipse.org/legal/epl-v10.html
8  *
9  *
10  */
11
12 package org.opendaylight.openflowplugin.impl.device;
13
14 import static org.mockito.Matchers.any;
15 import static org.mockito.Mockito.*;
16
17 import com.google.common.collect.Lists;
18 import com.google.common.util.concurrent.CheckedFuture;
19
20 import java.math.BigInteger;
21 import java.util.*;
22
23 import com.google.common.util.concurrent.ListenableFuture;
24 import org.opendaylight.openflowplugin.api.OFConstants;
25 import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator;
26 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupFeatures;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterFeatures;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.*;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.*;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeaturesBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeaturesBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.MultipartReplyPortDescBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.multipart.reply.port.desc.PortsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.multipart.reply.table.features.TableFeaturesBuilder;
41 import com.google.common.util.concurrent.Futures;
42 import org.junit.Test;
43 import org.junit.runner.RunWith;
44 import org.mockito.InOrder;
45 import org.mockito.Mock;
46 import org.mockito.runners.MockitoJUnitRunner;
47 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
48 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
49 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
50 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
51 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
52 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
53 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
54 import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueHandlerRegistration;
55 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
56 import org.opendaylight.openflowplugin.api.openflow.connection.OutboundQueueProvider;
57 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
58 import org.opendaylight.openflowplugin.api.openflow.device.DeviceState;
59 import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary;
60 import org.opendaylight.openflowplugin.api.openflow.md.core.TranslatorKey;
61 import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageIntelligenceAgency;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.*;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDesc;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDescBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeatures;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeaturesBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.multipart.reply.table.features.TableFeatures;
72 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
73 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
74 import org.opendaylight.yangtools.yang.common.RpcError;
75 import org.opendaylight.yangtools.yang.common.RpcResult;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
77 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
78
79 @RunWith(MockitoJUnitRunner.class)
80 public class DeviceManagerImplTest {
81
82     private static final boolean TEST_VALUE_SWITCH_FEATURE_MANDATORY = true;
83     private static final long TEST_VALUE_GLOBAL_NOTIFICATION_QUOTA = 2000l;
84     private static final KeyedInstanceIdentifier<Node, NodeKey> DUMMY_NODE_II = InstanceIdentifier.create(Nodes.class)
85             .child(Node.class, new NodeKey(new NodeId("dummyNodeId")));
86     private static final Short DUMMY_TABLE_ID = 1;
87     private static final Long DUMMY_MAX_METER = 544L;
88     private static final String DUMMY_DATAPATH_ID = "44";
89     private static final Long DUMMY_PORT_NUMBER = 21L;
90
91
92     @Mock
93     CheckedFuture<Void,TransactionCommitFailedException> mockedFuture;
94
95     @Test
96     public void onDeviceContextLevelUpFailTest() {
97         onDeviceContextLevelUp(true);
98     }
99
100     @Test
101     public void onDeviceContextLevelUpSuccessTest() {
102         onDeviceContextLevelUp(false);
103     }
104
105     private DeviceManagerImpl prepareDeviceManager() {
106         return prepareDeviceManager(false);
107     }
108
109     private DeviceManagerImpl prepareDeviceManager(boolean withException) {
110         DataBroker mockedDataBroker = mock(DataBroker.class);
111         WriteTransaction mockedWriteTransaction = mock(WriteTransaction.class);
112
113         BindingTransactionChain mockedTxChain = mock(BindingTransactionChain.class);
114         WriteTransaction mockedWTx = mock(WriteTransaction.class);
115         when(mockedTxChain.newWriteOnlyTransaction()).thenReturn(mockedWTx);
116         when(mockedDataBroker.createTransactionChain(any(TransactionChainListener.class))).thenReturn
117                 (mockedTxChain);
118         when(mockedDataBroker.newWriteOnlyTransaction()).thenReturn(mockedWriteTransaction);
119
120         when(mockedWriteTransaction.submit()).thenReturn(mockedFuture);
121
122         MessageIntelligenceAgency mockedMessageIntelligenceAgency = mock(MessageIntelligenceAgency.class);
123         DeviceManagerImpl deviceManager = new DeviceManagerImpl(mockedDataBroker, mockedMessageIntelligenceAgency, TEST_VALUE_SWITCH_FEATURE_MANDATORY,
124                 TEST_VALUE_GLOBAL_NOTIFICATION_QUOTA);
125
126         return deviceManager;
127     }
128
129     public void onDeviceContextLevelUp(boolean withException) {
130         DeviceManagerImpl deviceManager = prepareDeviceManager(withException);
131
132         DeviceContextImpl mockedDeviceContext = mock(DeviceContextImpl.class);
133         if (withException) {
134             doThrow(new IllegalStateException("dummy")).when(mockedDeviceContext).initialSubmitTransaction();
135             DeviceState mockedDeviceState = mock(DeviceState.class);
136             when(mockedDeviceContext.getDeviceState()).thenReturn(mockedDeviceState);
137         }
138
139         deviceManager.onDeviceContextLevelUp(mockedDeviceContext);
140         if (withException) {
141             verify(mockedDeviceContext).close();
142         } else {
143             verify(mockedDeviceContext).initialSubmitTransaction();
144             verify(mockedDeviceContext).onPublished();
145         }
146     }
147
148     @Test
149     public void deviceConnectedTest() {
150     }
151
152     @Test
153     public void deviceConnectedNewConnectionTest() {
154         DeviceManagerImpl deviceManager = prepareDeviceManager();
155         TranslatorLibrary mockedTraslatorLibrary = mock(TranslatorLibrary.class);
156         mockedTraslatorLibrary.lookupTranslator(any(TranslatorKey.class));
157
158         deviceManager.setTranslatorLibrary(mockedTraslatorLibrary);
159
160         ConnectionContext mockConnectionContext = mock(ConnectionContext.class);
161         when(mockConnectionContext.getNodeId()).thenReturn(new NodeId("dummyNodeId"));
162
163
164         FeaturesReply mockFeatures = mock(FeaturesReply.class);
165         when(mockConnectionContext.getFeatures()).thenReturn(mockFeatures);
166
167
168         ConnectionAdapter mockedConnectionAdapter = mock(ConnectionAdapter.class);
169         when(mockConnectionContext.getConnectionAdapter()).thenReturn(mockedConnectionAdapter);
170
171         deviceManager.deviceConnected(mockConnectionContext);
172
173         InOrder order = inOrder(mockConnectionContext);
174         order.verify(mockConnectionContext).getFeatures();
175         order.verify(mockConnectionContext).setOutboundQueueProvider(any(OutboundQueueProvider.class));
176         order.verify(mockConnectionContext).setOutboundQueueHandleRegistration(any(OutboundQueueHandlerRegistration
177                 .class));
178         order.verify(mockConnectionContext).getNodeId();
179         order.verify(mockConnectionContext).setDeviceDisconnectedHandler(any(DeviceContext.class));
180     }
181
182     @Test
183     public void chainTableTrunkWriteOF10Test() {
184         DeviceContext mockedDeviceContext = mock(DeviceContext.class);
185         DeviceState mockedDeviceState = mock(DeviceState.class);
186
187         GetFeaturesOutput mockedFeatures = mock(GetFeaturesOutput.class);
188         when(mockedFeatures.getTables()).thenReturn((short)2);
189         when(mockedDeviceState.getFeatures()).thenReturn(mockedFeatures);
190
191
192         when(mockedDeviceState.getNodeInstanceIdentifier()).thenReturn(DUMMY_NODE_II);
193         when(mockedDeviceContext.getDeviceState()).thenReturn(mockedDeviceState);
194
195         RpcResult<List<MultipartReply>> mockedRpcResult = mock(RpcResult.class);
196         when(mockedRpcResult.isSuccessful()).thenReturn(true);
197         List<RpcResult<List<MultipartReply>>> data = new ArrayList<RpcResult<List<MultipartReply>>>();
198         data.add(mockedRpcResult);
199         data.add(mockedRpcResult);
200
201         DeviceManagerImpl.chainTableTrunkWriteOF10(mockedDeviceContext, Futures.immediateFuture(data));
202         verify(mockedDeviceContext, times(3))
203                 .writeToTransaction(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(FlowCapableNode.class));
204     }
205
206     @Test
207     public void testTranslateAndWriteReplyTypeDesc() {
208         DeviceContext mockedDeviceContext = mock(DeviceContext.class);
209         Collection<MultipartReply> multipartReplyMessages = prepareDataforTypeDesc(mockedDeviceContext);
210
211         DeviceManagerImpl.translateAndWriteReply(MultipartType.OFPMPDESC, mockedDeviceContext, DUMMY_NODE_II, multipartReplyMessages);
212         verify(mockedDeviceContext)
213                 .writeToTransaction(eq(LogicalDatastoreType.OPERATIONAL), eq(DUMMY_NODE_II.augmentation(FlowCapableNode.class)), any(FlowCapableNode.class));
214     }
215
216     private Collection<MultipartReply> prepareDataforTypeDesc(final DeviceContext mockedDeviceContext) {
217         MultipartReplyDesc multipartReplyDesc = new MultipartReplyDescBuilder().build();
218
219         MultipartReplyDescCaseBuilder multipartReplyDescCaseBuilder = new MultipartReplyDescCaseBuilder();
220         multipartReplyDescCaseBuilder.setMultipartReplyDesc(multipartReplyDesc);
221
222         MultipartReplyMessage multipartReplyMessage = new MultipartReplyMessageBuilder().setMultipartReplyBody(multipartReplyDescCaseBuilder.build()).build();
223         return Collections.<MultipartReply>singleton(multipartReplyMessage);
224
225     }
226
227     @Test
228     public void translateAndWriteReplyTypeTableFeatures() {
229         DeviceContext mockedDeviceContext = mock(DeviceContext.class);
230
231         TableFeaturesBuilder tableFeature = new TableFeaturesBuilder();
232         tableFeature.setTableId(DUMMY_TABLE_ID);
233         List<TableFeatures> tableFeatures = new ArrayList<>();
234         tableFeatures.add(tableFeature.build());
235
236         MultipartReplyTableFeatures multipartReplyTableFeatures = new MultipartReplyTableFeaturesBuilder().setTableFeatures(tableFeatures).build();
237         MultipartReplyTableFeaturesCaseBuilder multipartReplyTableFeaturesCaseBuilder = new MultipartReplyTableFeaturesCaseBuilder();
238         multipartReplyTableFeaturesCaseBuilder.setMultipartReplyTableFeatures(multipartReplyTableFeatures);
239
240         MultipartReplyMessage multipartReplyMessage = new MultipartReplyMessageBuilder().setMultipartReplyBody(multipartReplyTableFeaturesCaseBuilder.build()).build();
241         Set<MultipartReply> multipartReplyMessages = Collections.<MultipartReply>singleton(multipartReplyMessage);
242         DeviceManagerImpl.translateAndWriteReply(MultipartType.OFPMPTABLEFEATURES, mockedDeviceContext, DUMMY_NODE_II, multipartReplyMessages);
243         verify(mockedDeviceContext)
244                 .writeToTransaction(eq(LogicalDatastoreType.OPERATIONAL),
245                         eq(DUMMY_NODE_II.augmentation(FlowCapableNode.class).child(Table.class, new TableKey(DUMMY_TABLE_ID))), any(Table.class));
246
247     }
248
249     @Test
250     public void translateAndWriteReplyTypeMeterFeatures() {
251         DeviceContext mockedDeviceContext = mock(DeviceContext.class);
252         DeviceState mockedDeviceState = mock(DeviceState.class);
253         when(mockedDeviceContext.getDeviceState()).thenReturn(mockedDeviceState);
254
255         MultipartReplyMeterFeaturesBuilder multipartReplyMeterFeaturesBuilder = new MultipartReplyMeterFeaturesBuilder();
256         multipartReplyMeterFeaturesBuilder.setBandTypes(new MeterBandTypeBitmap(true, true));
257         multipartReplyMeterFeaturesBuilder.setCapabilities(new MeterFlags(true, true, true, true));
258         multipartReplyMeterFeaturesBuilder.setMaxMeter(DUMMY_MAX_METER);
259
260         MultipartReplyMeterFeaturesCaseBuilder multipartReplyMeterFeaturesCaseBuilder = new MultipartReplyMeterFeaturesCaseBuilder();
261         multipartReplyMeterFeaturesCaseBuilder.setMultipartReplyMeterFeatures(multipartReplyMeterFeaturesBuilder.build());
262
263         MultipartReplyMessage multipartReplyMessage = new MultipartReplyMessageBuilder().setMultipartReplyBody(multipartReplyMeterFeaturesCaseBuilder.build()).build();
264         Set<MultipartReply> multipartReplyMessages = Collections.<MultipartReply>singleton(multipartReplyMessage);
265         DeviceManagerImpl.translateAndWriteReply(MultipartType.OFPMPMETERFEATURES, mockedDeviceContext, DUMMY_NODE_II, multipartReplyMessages);
266         verify(mockedDeviceContext)
267                 .writeToTransaction(eq(LogicalDatastoreType.OPERATIONAL), eq(DUMMY_NODE_II.augmentation(NodeMeterFeatures.class)), any(NodeMeterFeatures.class));
268         verify(mockedDeviceState).setMeterAvailable(eq(true));
269     }
270
271     @Test
272     public void translateAndWriteReplyTypeGroupFeatures() {
273         DeviceContext mockedDeviceContext = mock(DeviceContext.class);
274
275         MultipartReplyGroupFeaturesBuilder multipartReplyGroupFeaturesBuilder = new MultipartReplyGroupFeaturesBuilder();
276         multipartReplyGroupFeaturesBuilder.setTypes(new GroupTypes(true, true, true, true));
277         multipartReplyGroupFeaturesBuilder.setCapabilities(new GroupCapabilities(true, true, true, true));
278         ActionType actionType = new ActionType(true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true);
279         multipartReplyGroupFeaturesBuilder.setActionsBitmap(Lists.newArrayList(actionType));
280
281         MultipartReplyGroupFeatures multipartReplyGroupFeatures = multipartReplyGroupFeaturesBuilder.build();
282
283         MultipartReplyGroupFeaturesCaseBuilder multipartReplyGroupFeaturesCaseBuilder = new MultipartReplyGroupFeaturesCaseBuilder();
284         multipartReplyGroupFeaturesCaseBuilder.setMultipartReplyGroupFeatures(multipartReplyGroupFeatures);
285
286         MultipartReplyMessage multipartReplyMessage = new MultipartReplyMessageBuilder().setMultipartReplyBody(multipartReplyGroupFeaturesCaseBuilder.build()).build();
287         Set<MultipartReply> multipartReplyMessages = Collections.<MultipartReply>singleton(multipartReplyMessage);
288
289         DeviceManagerImpl.translateAndWriteReply(MultipartType.OFPMPGROUPFEATURES, mockedDeviceContext, DUMMY_NODE_II, multipartReplyMessages);
290         verify(mockedDeviceContext)
291                 .writeToTransaction(eq(LogicalDatastoreType.OPERATIONAL), eq(DUMMY_NODE_II.augmentation(NodeGroupFeatures.class)), any(NodeGroupFeatures.class));
292     }
293
294
295     @Test
296     public void translateAndWriteReplyTypePortDesc() {
297         DeviceContext mockedDeviceContext = mock(DeviceContext.class);
298
299         ConnectionContext mockedPrimaryConnectionContext = mock(ConnectionContext.class);
300         FeaturesReply mockedFeatures = mock(FeaturesReply.class);
301         when(mockedFeatures.getDatapathId()).thenReturn(new BigInteger(DUMMY_DATAPATH_ID));
302         when(mockedPrimaryConnectionContext.getFeatures()).thenReturn(mockedFeatures);
303         when(mockedDeviceContext.getPrimaryConnectionContext()).thenReturn(mockedPrimaryConnectionContext);
304         DeviceState mockedDeviceState = mock(DeviceState.class);
305         when(mockedDeviceState.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_0);
306         when(mockedDeviceContext.getDeviceState()).thenReturn(mockedDeviceState);
307         TranslatorLibrary translatorLibrary = mock(TranslatorLibrary.class);
308         MessageTranslator mockedTranslator = mock(MessageTranslator.class);
309         when(translatorLibrary.lookupTranslator(any(TranslatorKey.class))).thenReturn(mockedTranslator);
310         when(mockedDeviceContext.oook()).thenReturn(translatorLibrary);
311
312         MultipartReplyPortDescBuilder multipartReplyPortDescBuilder = new MultipartReplyPortDescBuilder();
313
314         PortsBuilder portsBuilder = new PortsBuilder();
315         portsBuilder.setPortNo(DUMMY_PORT_NUMBER);
316
317         multipartReplyPortDescBuilder.setPorts(Lists.newArrayList(portsBuilder.build()));
318
319         MultipartReplyPortDescCaseBuilder multipartReplyPortDescCaseBuilder = new MultipartReplyPortDescCaseBuilder();
320         multipartReplyPortDescCaseBuilder.setMultipartReplyPortDesc(multipartReplyPortDescBuilder.build());
321
322         MultipartReplyMessage multipartReplyMessage = new MultipartReplyMessageBuilder().setMultipartReplyBody(multipartReplyPortDescCaseBuilder.build()).build();
323         Set<MultipartReply> multipartReplyMessages = Collections.<MultipartReply>singleton(multipartReplyMessage);
324
325         OpenflowPortsUtil.init();
326         DeviceManagerImpl.translateAndWriteReply(MultipartType.OFPMPPORTDESC, mockedDeviceContext, DUMMY_NODE_II, multipartReplyMessages);
327         verify(mockedDeviceContext)
328                 .writeToTransaction(eq(LogicalDatastoreType.OPERATIONAL), any(InstanceIdentifier.class), any(NodeConnector.class));
329     }
330
331     @Test
332     public void createSuccessProcessingCallbackTest() {
333         DeviceContext mockedDeviceContext = mock(DeviceContext.class);
334         DeviceState mockedDeviceState = mock(DeviceState.class);
335         when(mockedDeviceContext.getDeviceState()).thenReturn(mockedDeviceState);
336
337         List<MultipartReply> multipartReplies = new ArrayList<>(prepareDataforTypeDesc(mockedDeviceContext));
338         RpcResult<List<MultipartReply>> result = RpcResultBuilder.<List<MultipartReply>>success(multipartReplies).build();
339         ListenableFuture<RpcResult<List<MultipartReply>>> mockedRequestContextFuture = Futures.immediateFuture(result);
340
341         DeviceManagerImpl.createSuccessProcessingCallback(MultipartType.OFPMPDESC, mockedDeviceContext, DUMMY_NODE_II, mockedRequestContextFuture);
342         verify(mockedDeviceContext).writeToTransaction(eq(LogicalDatastoreType.OPERATIONAL), eq(DUMMY_NODE_II.augmentation(FlowCapableNode.class)), any(FlowCapableNode.class));
343
344         RpcResult<List<MultipartReply>> rpcResult = RpcResultBuilder.<List<MultipartReply>>failed().withError(RpcError.ErrorType.PROTOCOL, "dummy error").build();
345         mockedRequestContextFuture = Futures.immediateFuture(rpcResult);
346         DeviceManagerImpl.createSuccessProcessingCallback(MultipartType.OFPMPDESC, mockedDeviceContext, DUMMY_NODE_II,mockedRequestContextFuture);
347         verify(mockedDeviceContext).writeToTransaction(eq(LogicalDatastoreType.OPERATIONAL), eq(DUMMY_NODE_II.augmentation(FlowCapableNode.class)), any(FlowCapableNode.class));
348
349     }
350 }