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