Update MRI projects for Aluminium
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / TableFeaturesConvertorTest.java
1 /*
2  * Copyright (c) 2014 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.openflow.md.core.sal.convertor;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13
14 import java.math.BigInteger;
15 import java.util.ArrayList;
16 import java.util.Collection;
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20 import java.util.Map.Entry;
21 import java.util.Optional;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.openflowplugin.api.OFConstants;
25 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActionsCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.MeterCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.table.update.UpdatedTableBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableConfig;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableFeatures;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.set.field.match.SetFieldMatchBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.TableFeaturePropType;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActions;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActionsBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActionsMiss;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActionsMissBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplySetfield;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplySetfieldBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplySetfieldMiss;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplySetfieldMissBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Instructions;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.InstructionsBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.InstructionsMiss;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.InstructionsMissBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Match;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.MatchBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.NextTable;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.NextTableBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.NextTableMiss;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.NextTableMissBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Wildcards;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WildcardsBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteActions;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteActionsBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteActionsMiss;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteActionsMissBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteSetfield;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteSetfieldBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteSetfieldMiss;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteSetfieldMissBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.TableProperties;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.TablePropertiesBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties.TableFeatureProperties;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties.TableFeaturePropertiesBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties.TableFeaturePropertiesKey;
89
90 public class TableFeaturesConvertorTest {
91     private static final TablePropertiesBuilder TABLE_PROPERTIES_BUILDER = new TablePropertiesBuilder();
92     private static final Map<Class<? extends TableFeaturePropType>, TableFeaturePropType> AUGMENTATIONS_MAP =
93             new HashMap<>();
94     private static final List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction
95         .Instruction> INSTRUCTIONS_LIST = new ArrayList<>();
96     private static final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list
97         .Action> ACTIONS = new ArrayList<>();
98     private static final List<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.set.field.match
99         .SetFieldMatch> FIELD_TABLE_FEATURES = new ArrayList<>();
100
101     private static void setupInstructionsList() {
102         INSTRUCTIONS_LIST.add(new GoToTableCaseBuilder().build());
103         INSTRUCTIONS_LIST.add(new WriteMetadataCaseBuilder().build());
104         INSTRUCTIONS_LIST.add(new WriteActionsCaseBuilder().build());
105         INSTRUCTIONS_LIST.add(new ApplyActionsCaseBuilder().build());
106         INSTRUCTIONS_LIST.add(new ClearActionsCaseBuilder().build());
107         INSTRUCTIONS_LIST.add(new MeterCaseBuilder().build());
108     }
109
110     private static void setupFieldTableFeatures() {
111         int order = 0;
112         SetFieldMatchBuilder setFieldMatchBuilder = new SetFieldMatchBuilder();
113         setFieldMatchBuilder.setHasMask(true);
114         setFieldMatchBuilder
115                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpOp.class);
116         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
117         setFieldMatchBuilder
118                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpSha.class);
119         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
120         setFieldMatchBuilder
121                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpSpa.class);
122         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
123         setFieldMatchBuilder
124                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpTha.class);
125         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
126         setFieldMatchBuilder
127                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpTpa.class);
128         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
129         setFieldMatchBuilder
130                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthDst.class);
131         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
132         setFieldMatchBuilder
133                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthSrc.class);
134         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
135         setFieldMatchBuilder
136                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthType.class);
137         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
138         setFieldMatchBuilder
139                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv4Code.class);
140         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
141         setFieldMatchBuilder
142                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv4Type.class);
143         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
144         setFieldMatchBuilder
145                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv6Code.class);
146         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
147         setFieldMatchBuilder
148                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv6Type.class);
149         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
150         setFieldMatchBuilder
151                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.InPhyPort.class);
152         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
153         setFieldMatchBuilder
154                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.InPort.class);
155         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
156         setFieldMatchBuilder
157                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpDscp.class);
158         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
159         setFieldMatchBuilder
160                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpEcn.class);
161         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
162         setFieldMatchBuilder
163                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpProto.class);
164         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
165         setFieldMatchBuilder
166                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv4Dst.class);
167         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
168         setFieldMatchBuilder
169                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv4Src.class);
170         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
171         setFieldMatchBuilder
172                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Dst.class);
173         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
174         setFieldMatchBuilder
175                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Exthdr.class);
176         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
177         setFieldMatchBuilder
178                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Flabel.class);
179         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
180         setFieldMatchBuilder
181                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6NdSll.class);
182         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
183         setFieldMatchBuilder
184                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6NdTarget.class);
185         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
186         setFieldMatchBuilder
187                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6NdTll.class);
188         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
189         setFieldMatchBuilder
190                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Src.class);
191         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
192         setFieldMatchBuilder
193                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Metadata.class);
194         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
195         setFieldMatchBuilder
196                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsBos.class);
197         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
198         setFieldMatchBuilder
199                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsLabel.class);
200         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
201         setFieldMatchBuilder
202                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsTc.class);
203         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
204         setFieldMatchBuilder
205                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.PbbIsid.class);
206         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
207         setFieldMatchBuilder
208                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.SctpDst.class);
209         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
210         setFieldMatchBuilder
211                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.SctpSrc.class);
212         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
213         setFieldMatchBuilder
214                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpDst.class);
215         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
216         setFieldMatchBuilder
217                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpSrc.class);
218         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
219         setFieldMatchBuilder
220                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelId.class);
221         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
222         setFieldMatchBuilder
223                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpDst.class);
224         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
225         setFieldMatchBuilder
226                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpSrc.class);
227         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
228         setFieldMatchBuilder
229                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanPcp.class);
230         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
231         setFieldMatchBuilder
232                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanVid.class);
233         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
234         setFieldMatchBuilder
235                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpFlags.class);
236         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
237         setFieldMatchBuilder
238                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Dst.class);
239         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
240         setFieldMatchBuilder
241                 .setMatchType(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Src.class);
242         FIELD_TABLE_FEATURES.add(setFieldMatchBuilder.build());
243     }
244
245     private static void setupActions() {
246         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder actionBuilder =
247                 new ActionBuilder();
248
249         int order = 0;
250         OutputActionCaseBuilder outputActionCaseBuilder = new OutputActionCaseBuilder();
251         ACTIONS.add(actionBuilder.setOrder(order++).setAction(outputActionCaseBuilder.build()).build());
252
253         GroupActionCaseBuilder groupActionCaseBuilder = new GroupActionCaseBuilder();
254         ACTIONS.add(actionBuilder.setOrder(order++).setAction(groupActionCaseBuilder.build()).build());
255
256         CopyTtlOutCaseBuilder copyTtlOutCaseBuilder = new CopyTtlOutCaseBuilder();
257         ACTIONS.add(actionBuilder.setOrder(order++).setAction(copyTtlOutCaseBuilder.build()).build());
258
259         CopyTtlInCaseBuilder copyTtlInCaseBuilder = new CopyTtlInCaseBuilder();
260         ACTIONS.add(actionBuilder.setOrder(order++).setAction(copyTtlInCaseBuilder.build()).build());
261
262         SetMplsTtlActionCaseBuilder setMplsTtlActionCaseBuilder = new SetMplsTtlActionCaseBuilder();
263         ACTIONS.add(actionBuilder.setOrder(order++).setAction(setMplsTtlActionCaseBuilder.build()).build());
264
265         DecMplsTtlCaseBuilder decMplsTtlCaseBuilder = new DecMplsTtlCaseBuilder();
266         ACTIONS.add(actionBuilder.setOrder(order++).setAction(decMplsTtlCaseBuilder.build()).build());
267
268         PushVlanActionCaseBuilder pushVlanActionCaseBuilder = new PushVlanActionCaseBuilder();
269         ACTIONS.add(actionBuilder.setOrder(order++).setAction(pushVlanActionCaseBuilder.build()).build());
270
271         PopVlanActionCaseBuilder popVlanActionCaseBuilder = new PopVlanActionCaseBuilder();
272         ACTIONS.add(actionBuilder.setOrder(order++).setAction(popVlanActionCaseBuilder.build()).build());
273
274         PushMplsActionCaseBuilder pushMplsActionCaseBuilder = new PushMplsActionCaseBuilder();
275         ACTIONS.add(actionBuilder.setOrder(order++).setAction(pushMplsActionCaseBuilder.build()).build());
276
277         PopMplsActionCaseBuilder popMplsActionCaseBuilder = new PopMplsActionCaseBuilder();
278         ACTIONS.add(actionBuilder.setOrder(order++).setAction(popMplsActionCaseBuilder.build()).build());
279
280         SetQueueActionCaseBuilder setQueueActionCaseBuilder = new SetQueueActionCaseBuilder();
281         ACTIONS.add(actionBuilder.setOrder(order++).setAction(setQueueActionCaseBuilder.build()).build());
282
283         SetNwTtlActionCaseBuilder setNwTtlActionCaseBuilder = new SetNwTtlActionCaseBuilder();
284         ACTIONS.add(actionBuilder.setOrder(order++).setAction(setNwTtlActionCaseBuilder.build()).build());
285
286         DecNwTtlCaseBuilder decNwTtlCaseBuilder = new DecNwTtlCaseBuilder();
287         ACTIONS.add(actionBuilder.setOrder(order++).setAction(decNwTtlCaseBuilder.build()).build());
288
289         SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
290         ACTIONS.add(actionBuilder.setOrder(order++).setAction(setFieldCaseBuilder.build()).build());
291
292         PushPbbActionCaseBuilder pushPbbActionCaseBuilder = new PushPbbActionCaseBuilder();
293         ACTIONS.add(actionBuilder.setOrder(order++).setAction(pushPbbActionCaseBuilder.build()).build());
294
295         PopPbbActionCaseBuilder popPbbActionCaseBuilder = new PopPbbActionCaseBuilder();
296         ACTIONS.add(actionBuilder.setOrder(order++).setAction(popPbbActionCaseBuilder.build()).build());
297
298     }
299
300     @Before
301     public void setupTest() {
302         setupInstructionsList();
303         setupActions();
304         setupFieldTableFeatures();
305         InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
306         List<Instruction> instructions = new ArrayList<>();
307         int order = 0;
308         for (var element : INSTRUCTIONS_LIST) {
309             instructions.add(new InstructionBuilder()
310                 .setOrder(order++)
311                 .setInstruction(element).build());
312         }
313         org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature
314             .prop.type.instructions.InstructionsBuilder instructionsBuilder1 =
315                 new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table
316                     .feature.prop.type.instructions.InstructionsBuilder();
317         instructionsBuilder1.setInstruction(instructions);
318         instructionsBuilder.setInstructions(instructionsBuilder1.build());
319
320         AUGMENTATIONS_MAP.put(Instructions.class, instructionsBuilder.build());
321
322         InstructionsMissBuilder instructionsMissBuilder = new InstructionsMissBuilder();
323         org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop
324             .type.instructions.miss.InstructionsMissBuilder instructionsMissBuilder1 =
325                 new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table
326                     .feature.prop.type.instructions.miss.InstructionsMissBuilder();
327         instructionsMissBuilder1.setInstruction(instructions);
328         instructionsMissBuilder.setInstructionsMiss(instructionsMissBuilder1.build());
329         AUGMENTATIONS_MAP.put(InstructionsMiss.class, instructionsMissBuilder.build());
330
331         NextTableBuilder nextTableBuilder = new NextTableBuilder();
332         AUGMENTATIONS_MAP.put(NextTable.class, nextTableBuilder.build());
333
334         NextTableMissBuilder nextTableMissBuilder = new NextTableMissBuilder();
335         AUGMENTATIONS_MAP.put(NextTableMiss.class, nextTableMissBuilder.build());
336
337         WriteActionsBuilder writeActionsBuilder = new WriteActionsBuilder();
338         AUGMENTATIONS_MAP.put(WriteActions.class, writeActionsBuilder.build());
339
340         WriteActionsMissBuilder writeActionsMissBuilder = new WriteActionsMissBuilder();
341         AUGMENTATIONS_MAP.put(WriteActionsMiss.class, writeActionsMissBuilder.build());
342
343         ApplyActionsBuilder applyActionsBuilder = new ApplyActionsBuilder();
344         AUGMENTATIONS_MAP.put(ApplyActions.class, applyActionsBuilder.build());
345
346         ApplyActionsMissBuilder applyActionsMissBuilder = new ApplyActionsMissBuilder();
347         org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop
348             .type.apply.actions.miss.ApplyActionsMissBuilder applyActionsMissBuilder1 =
349                 new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table
350                     .feature.prop.type.apply.actions.miss.ApplyActionsMissBuilder();
351         applyActionsMissBuilder1.setAction(ACTIONS);
352         applyActionsMissBuilder.setApplyActionsMiss(applyActionsMissBuilder1.build());
353         AUGMENTATIONS_MAP.put(ApplyActionsMiss.class, applyActionsMissBuilder.build());
354
355         MatchBuilder matchBuilder = new MatchBuilder();
356         AUGMENTATIONS_MAP.put(Match.class, matchBuilder.build());
357
358         WildcardsBuilder wildcardsBuilder = new WildcardsBuilder();
359         AUGMENTATIONS_MAP.put(Wildcards.class, wildcardsBuilder.build());
360
361         WriteSetfieldBuilder writeSetfieldBuilder = new WriteSetfieldBuilder();
362         AUGMENTATIONS_MAP.put(WriteSetfield.class, writeSetfieldBuilder.build());
363
364         WriteSetfieldMissBuilder writeSetfieldMissBuilder = new WriteSetfieldMissBuilder();
365         AUGMENTATIONS_MAP.put(WriteSetfieldMiss.class, writeSetfieldMissBuilder.build());
366
367         ApplySetfieldBuilder applySetfieldBuilder = new ApplySetfieldBuilder();
368         org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop
369             .type.apply.setfield.ApplySetfieldBuilder applySetfieldBuilder1 =
370                 new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table
371                     .feature.prop.type.apply.setfield.ApplySetfieldBuilder();
372         applySetfieldBuilder1.setSetFieldMatch(FIELD_TABLE_FEATURES);
373         applySetfieldBuilder.setApplySetfield(applySetfieldBuilder1.build());
374         AUGMENTATIONS_MAP.put(ApplySetfield.class, applySetfieldBuilder.build());
375
376         ApplySetfieldMissBuilder applySetfieldMissBuilder = new ApplySetfieldMissBuilder();
377         AUGMENTATIONS_MAP.put(ApplySetfieldMiss.class, applySetfieldMissBuilder.build());
378     }
379
380     @Test
381     public void testToTableFeaturesRequest() {
382         List<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures>
383             tableFeaturesList = new ArrayList<>();
384         org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesBuilder
385             tableFeaturesBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table
386                 .features.TableFeaturesBuilder();
387         for (int i = 0; i < 10; i++) {
388             tableFeaturesBuilder.setTableId((short) i);
389             tableFeaturesBuilder.setName(String.format("table:%d", i));
390             tableFeaturesBuilder.setMetadataMatch(BigInteger.ONE);
391             tableFeaturesBuilder.setMetadataWrite(BigInteger.ONE);
392             tableFeaturesBuilder.setMaxEntries((long) 1 + 10 * i);
393             tableFeaturesBuilder.setConfig(new TableConfig(false));
394             tableFeaturesBuilder.setTableProperties(getTableProperties());
395             tableFeaturesList.add(tableFeaturesBuilder.build());
396         }
397
398         TableFeatures tableFeatures = new UpdatedTableBuilder()
399                 .setTableFeatures(tableFeaturesList)
400                 .build();
401
402         final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
403
404         Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request
405             .multipart.request.body.multipart.request.table.features._case.multipart.request.table.features
406                 .TableFeatures>> tableFeaturesesOptional =
407                     convertorManager.convert(tableFeatures, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
408
409         assertNotNull(tableFeatures);
410         assertEquals(10, tableFeatures.getTableFeatures().size());
411         Collection<TableFeatureProperties> tableFeaturePropertieses = tableFeatures.nonnullTableFeatures().values()
412                 .iterator().next().getTableProperties().nonnullTableFeatureProperties().values();
413         assertEquals(AUGMENTATIONS_MAP.size() + 1, tableFeaturePropertieses.size());
414
415         org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature
416             .prop.type.ApplyActionsMiss applyActionsMiss = null;
417         for (var featureProp : tableFeaturePropertieses) {
418             var prop = featureProp.getTableFeaturePropType();
419             if (prop.implementedInterface().isAssignableFrom(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types
420                     .rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActionsMiss.class)) {
421                 applyActionsMiss = (org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature
422                     .prop.type.table.feature.prop.type.ApplyActionsMiss) prop;
423                 break;
424             }
425         }
426
427         assertNotNull(applyActionsMiss);
428         assertEquals(ACTIONS.size(), applyActionsMiss.getApplyActionsMiss().getAction().size());
429
430     }
431
432     private static TableProperties getTableProperties() {
433         TableFeaturePropertiesBuilder tableFeaturePropertiesBuilder = new TableFeaturePropertiesBuilder();
434         List<TableFeatureProperties> tableFeaturePropertieses = new ArrayList<>();
435         int counter = 0;
436         int order = 0;
437         for (Entry<Class<? extends TableFeaturePropType>, TableFeaturePropType> entry : AUGMENTATIONS_MAP.entrySet()) {
438             counter++;
439             tableFeaturePropertiesBuilder.setTableFeaturePropType(entry.getValue());
440             tableFeaturePropertiesBuilder.setOrder(counter);
441             tableFeaturePropertiesBuilder.withKey(new TableFeaturePropertiesKey(order++));
442             tableFeaturePropertieses.add(tableFeaturePropertiesBuilder.build());
443         }
444         tableFeaturePropertieses.add(
445                 tableFeaturePropertiesBuilder.withKey(new TableFeaturePropertiesKey(order++)).build());
446         TABLE_PROPERTIES_BUILDER.setTableFeatureProperties(tableFeaturePropertieses);
447         return TABLE_PROPERTIES_BUILDER.build();
448     }
449 }