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