Bug:129 Connection Manager Dashlet
[controller.git] / opendaylight / md-sal / sal-compability / src / test / java / org / opendaylight / controller / sal / compability / TestToSalConversionsUtils.java
1 package org.opendaylight.controller.sal.compability;
2
3 import com.google.common.net.InetAddresses;
4 import org.junit.Test;
5 import org.opendaylight.controller.sal.action.Flood;
6 import org.opendaylight.controller.sal.action.FloodAll;
7 import org.opendaylight.controller.sal.action.HwPath;
8 import org.opendaylight.controller.sal.action.Loopback;
9 import org.opendaylight.controller.sal.action.Output;
10 import org.opendaylight.controller.sal.action.PopVlan;
11 import org.opendaylight.controller.sal.action.PushVlan;
12 import org.opendaylight.controller.sal.action.SetDlDst;
13 import org.opendaylight.controller.sal.action.SetDlSrc;
14 import org.opendaylight.controller.sal.action.SetDlType;
15 import org.opendaylight.controller.sal.action.SetNextHop;
16 import org.opendaylight.controller.sal.action.SetNwDst;
17 import org.opendaylight.controller.sal.action.SetNwSrc;
18 import org.opendaylight.controller.sal.action.SetNwTos;
19 import org.opendaylight.controller.sal.action.SetTpDst;
20 import org.opendaylight.controller.sal.action.SetTpSrc;
21 import org.opendaylight.controller.sal.action.SetVlanCfi;
22 import org.opendaylight.controller.sal.action.SetVlanId;
23 import org.opendaylight.controller.sal.action.SetVlanPcp;
24 import org.opendaylight.controller.sal.action.SwPath;
25 import org.opendaylight.controller.sal.flowprogrammer.Flow;
26 import org.opendaylight.controller.sal.match.MatchType;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.VlanCfi;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.ControllerActionBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.DropActionBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.FloodActionBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.FloodAllActionBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.HwPathActionBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.LoopbackActionBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.OutputActionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PopMplsActionBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PopVlanActionBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PushMplsActionBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PushPbbActionBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PushVlanActionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlDstActionBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlSrcActionBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlTypeActionBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetMplsTtlActionBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNextHopActionBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwDstActionBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwSrcActionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwTosActionBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwTtlActionBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetQueueActionBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetTpDstActionBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetTpSrcActionBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanCfiActionBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanIdActionBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanPcpActionBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SwPathActionBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.Action;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.ActionBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4Builder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6Builder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActions;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestination;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSource;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
103
104 import java.math.BigInteger;
105 import java.net.Inet4Address;
106 import java.net.Inet6Address;
107 import java.net.InetAddress;
108 import java.util.ArrayList;
109 import java.util.Collections;
110 import java.util.List;
111
112 import static org.junit.Assert.assertEquals;
113 import static org.junit.Assert.assertTrue;
114 import static org.opendaylight.controller.sal.compability.ProtocolConstants.ETHERNET_ARP;
115 import static org.opendaylight.controller.sal.compability.ProtocolConstants.SCTP;
116 import static org.opendaylight.controller.sal.compability.ProtocolConstants.TCP;
117 import static org.opendaylight.controller.sal.compability.ProtocolConstants.UDP;
118
119 public class TestToSalConversionsUtils {
120     // prefix:
121     // od|Od = Open Daylight
122     private enum MtchType {
123         other, ipv4, ipv6, arp, sctp, tcp, udp
124     }
125
126     @Test
127     public void testToSalConversion() {
128         FlowAddedBuilder odNodeFlowBuilder = new FlowAddedBuilder();
129         odNodeFlowBuilder = prepareOdFlowCommon();
130
131         Flow salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.other));
132         checkSalMatch(salFlow.getMatch(), MtchType.other);
133
134         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.ipv4));
135         checkSalMatch(salFlow.getMatch(), MtchType.ipv4);
136
137         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.ipv6));
138         checkSalMatch(salFlow.getMatch(), MtchType.ipv6);
139
140         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.arp));
141         checkSalMatch(salFlow.getMatch(), MtchType.arp);
142
143         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.sctp));
144         checkSalMatch(salFlow.getMatch(), MtchType.sctp);
145
146         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.tcp));
147         checkSalMatch(salFlow.getMatch(), MtchType.tcp);
148
149         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.udp));
150         checkSalMatch(salFlow.getMatch(), MtchType.udp);
151
152         checkSalFlow(salFlow);
153     }
154
155     private void checkSalMatch(org.opendaylight.controller.sal.match.Match match, MtchType mt) {
156         switch (mt) {
157         case other:
158             /*assertNotNull("DL_DST isn't equal.", "3C:A9:F4:00:E0:C8", 
159                     new String((byte[]) match.getField(MatchType.DL_DST).getValue()));
160             assertEquals("DL_SRC isn't equal.", "24:77:03:7C:C5:F1",
161                     new String((byte[]) match.getField(MatchType.DL_SRC).getValue()));
162             */
163             assertEquals("DL_TYPE isn't equal.", (short) 0xffff, (short) match.getField(MatchType.DL_TYPE).getValue());
164             assertEquals("NW_TOS isn't equal.", (byte) 0x33, (byte) match.getField(MatchType.NW_TOS).getValue());
165             assertEquals("NW_PROTO isn't equal.", (byte) 0x3f, (byte) match.getField(MatchType.NW_PROTO).getValue());
166             assertEquals("DL_VLAN isn't equal.", (short) 0xfff, (short) match.getField(MatchType.DL_VLAN).getValue());
167             assertEquals("DL_VLAN_PR isn't equal.", (byte) 0x7, (byte) match.getField(MatchType.DL_VLAN_PR).getValue());
168             break;
169         case arp:
170             /*
171             assertEquals("DL_SRC isn't equal.", "22:44:66:88:AA:CC",
172                     new String((byte[]) match.getField(MatchType.DL_SRC).getValue()));
173             assertEquals("DL_DST isn't equal.", "11:33:55:77:BB:DD",
174                     new String((byte[]) match.getField(MatchType.DL_DST).getValue()));
175             */
176             assertEquals("NW_SRC isn't equal.", "192.168.1.101",
177                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_SRC).getValue()));
178             assertEquals("NW_DST isn't equal.", "192.168.1.102",
179                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_DST).getValue()));
180             assertEquals("DL_TYPE isn't equal.", ETHERNET_ARP, match.getField(MatchType.DL_TYPE).getValue());
181             break;
182         case ipv4:
183             assertEquals("NW_SRC isn't equal.", "192.168.1.104",
184                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_SRC).getValue()));
185             assertEquals("NW_DST isn't equal.", "192.168.1.105",
186                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_DST).getValue()));
187             break;
188         case ipv6:
189             assertEquals("NW_SRC isn't equal.", "3001:db8:85a3::8a2e:370:7334",
190                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_SRC).getValue()));
191             assertEquals("NW_DST isn't equal.", "3001:db8:85a3::8a2e:370:7335",
192                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_DST).getValue()));
193             break;
194         case sctp:
195             assertEquals("TP_SRC isn't equal.", 31, (short) match.getField(MatchType.TP_SRC).getValue());
196             assertEquals("TP_DST isn't equal.", 32, (short) match.getField(MatchType.TP_DST).getValue());
197             assertEquals("NW_PROTO isn't equal.", SCTP, (byte) match.getField(MatchType.NW_PROTO).getValue());
198             break;
199         case tcp:
200             assertEquals("TP_SRC isn't equal.", 21, (short) match.getField(MatchType.TP_SRC).getValue());
201             assertEquals("TP_DST isn't equal.", 22, (short) match.getField(MatchType.TP_DST).getValue());
202             assertEquals("NW_PROTO isn't equal.", TCP, (byte) match.getField(MatchType.NW_PROTO).getValue());
203             break;
204         case udp:
205             assertEquals("TP_SRC isn't equal.", 11, (short) match.getField(MatchType.TP_SRC).getValue());
206             assertEquals("TP_DST isn't equal.", 12, (short) match.getField(MatchType.TP_DST).getValue());
207             assertEquals("NW_PROTO isn't equal.", UDP, (byte) match.getField(MatchType.NW_PROTO).getValue());
208             break;
209         default:
210             break;
211
212         }
213
214     }
215
216     private void checkSalFlow(Flow salFlow) {
217         assertTrue("Id value is incorrect.", salFlow.getId() == 9223372036854775807L);
218         assertTrue("Hard timeout is incorrect.", salFlow.getHardTimeout() == 32767);
219         assertTrue("Iddle timeout is incorrect.", salFlow.getIdleTimeout() == 32767);
220         assertTrue("Priority value is incorrect.", salFlow.getPriority() == 32767);
221
222         checkSalActions(salFlow.getActions());
223     }
224
225     private void checkSalActions(List<org.opendaylight.controller.sal.action.Action> actions) {
226         checkSalAction(actions, Flood.class, 1);
227         checkSalAction(actions, FloodAll.class, 1);
228         checkSalAction(actions, HwPath.class, 1);
229         checkSalAction(actions, Loopback.class, 1);
230         checkSalAction(actions, Output.class, 2, true);
231         checkSalAction(actions, PopVlan.class, 1);
232         checkSalAction(actions, PushVlan.class, 1, true);
233         checkSalAction(actions, SetDlDst.class, 1, true);
234         checkSalAction(actions, SetDlSrc.class, 1, true);
235         checkSalAction(actions, SetDlType.class, 1, true);
236         checkSalAction(actions, SetNextHop.class, 2, true);
237         checkSalAction(actions, SetNwDst.class, 2, true);
238         checkSalAction(actions, SetNwSrc.class, 2, true);
239         checkSalAction(actions, SetNwTos.class, 1, true);
240         checkSalAction(actions, SetTpDst.class, 1, true);
241         checkSalAction(actions, SetTpSrc.class, 1, true);
242         checkSalAction(actions, SetVlanCfi.class, 1, true);
243         checkSalAction(actions, SetVlanId.class, 1, true);
244         checkSalAction(actions, SetVlanPcp.class, 1, true);
245         checkSalAction(actions, SwPath.class, 1);
246     }
247
248     private void checkSalAction(List<org.opendaylight.controller.sal.action.Action> actions, Class<?> cls,
249             int numOfActions) {
250         checkSalAction(actions, cls, numOfActions, false);
251     }
252
253     private void checkSalAction(List<org.opendaylight.controller.sal.action.Action> actions, Class<?> cls,
254             int numOfActions, boolean additionalCheck) {
255         int numOfEqualClass = 0;
256         for (org.opendaylight.controller.sal.action.Action action : actions) {
257             if (action.getClass().equals(cls)) {
258                 if (additionalCheck) {
259                     additionalActionCheck(action);
260                 }
261                 numOfEqualClass++;
262             }
263         }
264         assertEquals("Incorrect number of actions of type " + cls.getName() + " was found.", numOfActions,
265                 numOfEqualClass);
266     }
267
268     // implement special checks
269     private void additionalActionCheck(org.opendaylight.controller.sal.action.Action action) {
270         if (action instanceof Output) {
271             // ((Output)action).getPort() //TODO finish check when mapping will
272             // be defined
273         } else if (action instanceof PushVlan) {
274             assertEquals("Wrong value for action PushVlan for tag.", 0x8100, ((PushVlan) action).getTag());
275             assertEquals("Wrong value for action PushVlan for pcp.", 7, ((PushVlan) action).getPcp());
276             assertEquals("Wrong value for action PushVlan for cfi.", 1, ((PushVlan) action).getCfi());
277             assertEquals("Wrong value for action PushVlan for vlanID.", 4095, ((PushVlan) action).getVlanId());
278         } else if (action instanceof SetDlDst) {
279             //assertEquals("Wrong value for action SetDlDst for MAC address.", "3C:A9:F4:00:E0:C8", new String(
280             //        ((SetDlDst) action).getDlAddress()));
281         } else if (action instanceof SetDlSrc) {
282             //assertEquals("Wrong value for action SetDlSrc for MAC address.", "24:77:03:7C:C5:F1", new String(
283             //      ((SetDlSrc) action).getDlAddress()));
284         } else if (action instanceof SetDlType) {
285             assertEquals("Wrong value for action SetDlType for.", 513l, ((SetDlType) action).getDlType());
286         } else if (action instanceof SetNextHop) {
287             InetAddress inetAddress = ((SetNextHop) action).getAddress();
288             checkIpAddresses(inetAddress, "192.168.100.100", "2001:db8:85a3::8a2e:370:7334");
289         } else if (action instanceof SetNwDst) {
290             InetAddress inetAddress = ((SetNwDst) action).getAddress();
291             checkIpAddresses(inetAddress, "192.168.100.101", "2001:db8:85a3::8a2e:370:7335");
292         } else if (action instanceof SetNwSrc) {
293             InetAddress inetAddress = ((SetNwSrc) action).getAddress();
294             checkIpAddresses(inetAddress, "192.168.100.102", "2001:db8:85a3::8a2e:370:7336");
295         } else if (action instanceof SetNwTos) {
296             assertEquals("Wrong value for action SetNwTos for tos.", 63, ((SetNwTos) action).getNwTos());
297         } else if (action instanceof SetTpDst) {
298             assertEquals("Wrong value for action SetTpDst for port.", 65535, ((SetTpDst) action).getPort());
299         } else if (action instanceof SetTpSrc) {
300             assertEquals("Wrong value for action SetTpSrc for port.", 65535, ((SetTpSrc) action).getPort());
301         } else if (action instanceof SetVlanCfi) {
302             assertEquals("Wrong value for action SetVlanCfi for port.", 1, ((SetVlanCfi) action).getCfi());
303         } else if (action instanceof SetVlanId) {
304             assertEquals("Wrong value for action SetVlanId for vlan ID.", 4095, ((SetVlanId) action).getVlanId());
305         } else if (action instanceof SetVlanPcp) {
306             assertEquals("Wrong value for action SetVlanPcp for vlan ID.", 7, ((SetVlanPcp) action).getPcp());
307         }
308     }
309
310     private void checkIpAddresses(InetAddress inetAddress, String ipv4, String ipv6) {
311         if (inetAddress instanceof Inet4Address) {
312             assertEquals("Wrong value for IP address.", ipv4, InetAddresses.toAddrString(inetAddress));
313         } else if (inetAddress instanceof Inet6Address) {
314             assertEquals("Wrong value for IP address.", ipv6, InetAddresses.toAddrString(inetAddress));
315         }
316     }
317
318     private FlowAddedBuilder prepareOdFlowCommon() {
319         FlowAddedBuilder odNodeFlowBuilder = new FlowAddedBuilder();
320
321         odNodeFlowBuilder.setCookie(new BigInteger("9223372036854775807"));
322         odNodeFlowBuilder.setHardTimeout(32767);
323         odNodeFlowBuilder.setIdleTimeout(32767);
324         odNodeFlowBuilder.setPriority(32767);
325         odNodeFlowBuilder.setInstructions(prepareOdActions());
326         return odNodeFlowBuilder;
327     }
328
329     private NodeFlow prepareOdFlow(FlowAddedBuilder odNodeFlowBuilder, MtchType mt) {
330         odNodeFlowBuilder.setMatch(prepOdMatch(mt));
331         return odNodeFlowBuilder.build();
332     }
333
334     private Instructions prepareOdActions() {
335         List<Action> odActions = new ArrayList<>();
336
337         ControllerActionBuilder controllerActionBuilder = new ControllerActionBuilder();
338         DropActionBuilder dropActionBuilder = new DropActionBuilder();
339         FloodActionBuilder floodActionBuilder = new FloodActionBuilder();
340         FloodAllActionBuilder floodAllActionBuilder = new FloodAllActionBuilder();
341         HwPathActionBuilder hwPathActionBuilder = new HwPathActionBuilder();
342         LoopbackActionBuilder loopbackActionBuilder = new LoopbackActionBuilder();
343         OutputActionBuilder outputActionBuilder = new OutputActionBuilder();
344         PopMplsActionBuilder popMplsActionBuilder = new PopMplsActionBuilder();
345         PopVlanActionBuilder popVlanActionBuilder = new PopVlanActionBuilder();
346         PushMplsActionBuilder pushMplsActionBuilder = new PushMplsActionBuilder();
347         PushPbbActionBuilder pushPbbActionBuilder = new PushPbbActionBuilder();
348         PushVlanActionBuilder pushVlanActionBuilder = new PushVlanActionBuilder();
349         SetDlDstActionBuilder setDlDstActionBuilder = new SetDlDstActionBuilder();
350         SetDlSrcActionBuilder setDlSrcActionBuilder = new SetDlSrcActionBuilder();
351         SetDlTypeActionBuilder setDlTypeActionBuilder = new SetDlTypeActionBuilder();
352         SetMplsTtlActionBuilder setMplsTtlActionBuilder = new SetMplsTtlActionBuilder();
353         SetNwTosActionBuilder setNwTosActionBuilder = new SetNwTosActionBuilder();
354         SetNwTtlActionBuilder setNwTtlActionBuilder = new SetNwTtlActionBuilder();
355         SetQueueActionBuilder setQueueActionBuilder = new SetQueueActionBuilder();
356         SetTpDstActionBuilder setTpDstActionBuilder = new SetTpDstActionBuilder();
357         SetTpSrcActionBuilder setTpSrcActionBuilder = new SetTpSrcActionBuilder();
358         SetVlanCfiActionBuilder setVlanCfiActionBuilder = new SetVlanCfiActionBuilder();
359         SetVlanIdActionBuilder setVlanIdActionBuilder = new SetVlanIdActionBuilder();
360         SetVlanPcpActionBuilder setVlanPcpActionBuilder = new SetVlanPcpActionBuilder();
361         SwPathActionBuilder swPathActionBuilder = new SwPathActionBuilder();
362
363         prepareActionOutput(outputActionBuilder);
364         prepareActionPushVlan(pushVlanActionBuilder);
365         prepareActionSetDlDst(setDlDstActionBuilder);
366         prepareActionSetDlSrc(setDlSrcActionBuilder);
367         prepareActionSetDlType(setDlTypeActionBuilder);
368         prepareActionNextHop(odActions);
369         prepareActionSetNwDst(odActions);
370         prepareActionSetNwSrc(odActions);
371         prepareActionSetNwTos(setNwTosActionBuilder);
372         prepareActionSetTpDst(setTpDstActionBuilder);
373         prepareActionSetTpSrc(setTpSrcActionBuilder);
374         prepareActionSetVlanCfi(setVlanCfiActionBuilder);
375         prepareActionSetVladId(setVlanIdActionBuilder);
376         prepareActionSetVlanPcp(setVlanPcpActionBuilder);
377
378         odActions.add(new ActionBuilder().setAction(controllerActionBuilder.build()).build());
379         odActions.add(new ActionBuilder().setAction(dropActionBuilder.build()).build());
380         odActions.add(new ActionBuilder().setAction(floodActionBuilder.build()).build());
381         odActions.add(new ActionBuilder().setAction(floodAllActionBuilder.build()).build());
382         odActions.add(new ActionBuilder().setAction(hwPathActionBuilder.build()).build());
383         odActions.add(new ActionBuilder().setAction(loopbackActionBuilder.build()).build());
384         odActions.add(new ActionBuilder().setAction(outputActionBuilder.build()).build());
385         odActions.add(new ActionBuilder().setAction(popMplsActionBuilder.build()).build());
386         odActions.add(new ActionBuilder().setAction(popVlanActionBuilder.build()).build());
387         odActions.add(new ActionBuilder().setAction(pushMplsActionBuilder.build()).build());
388         odActions.add(new ActionBuilder().setAction(pushPbbActionBuilder.build()).build());
389         odActions.add(new ActionBuilder().setAction(pushVlanActionBuilder.build()).build());
390         odActions.add(new ActionBuilder().setAction(setDlDstActionBuilder.build()).build());
391         odActions.add(new ActionBuilder().setAction(setDlSrcActionBuilder.build()).build());
392         odActions.add(new ActionBuilder().setAction(setDlTypeActionBuilder.build()).build());
393         odActions.add(new ActionBuilder().setAction(setMplsTtlActionBuilder.build()).build());
394         odActions.add(new ActionBuilder().setAction(setNwTosActionBuilder.build()).build());
395         odActions.add(new ActionBuilder().setAction(setNwTtlActionBuilder.build()).build());
396         odActions.add(new ActionBuilder().setAction(setQueueActionBuilder.build()).build());
397         odActions.add(new ActionBuilder().setAction(setTpDstActionBuilder.build()).build());
398         odActions.add(new ActionBuilder().setAction(setTpSrcActionBuilder.build()).build());
399         odActions.add(new ActionBuilder().setAction(setVlanCfiActionBuilder.build()).build());
400         odActions.add(new ActionBuilder().setAction(setVlanIdActionBuilder.build()).build());
401         odActions.add(new ActionBuilder().setAction(setVlanPcpActionBuilder.build()).build());
402         odActions.add(new ActionBuilder().setAction(swPathActionBuilder.build()).build());
403
404         
405         ApplyActions innerInst = new ApplyActionsBuilder().setAction(odActions).build();
406         Instruction applyActions = new InstructionBuilder().setInstruction(innerInst).build();
407         List<Instruction> instructions = Collections.singletonList(applyActions );
408         InstructionsBuilder instBuilder = new InstructionsBuilder();
409         
410         instBuilder.setInstruction(instructions);
411         
412         return instBuilder.build();
413     }
414
415     private void prepareActionSetVlanPcp(SetVlanPcpActionBuilder setVlanPcpActionBuilder) {
416         setVlanPcpActionBuilder.setVlanPcp(new VlanPcp((short) 7));
417     }
418
419     private void prepareActionSetVladId(SetVlanIdActionBuilder setVlanIdActionBuilder) {
420         setVlanIdActionBuilder.setVlanId(new VlanId(4095));
421     }
422
423     private void prepareActionSetVlanCfi(SetVlanCfiActionBuilder setVlanCfiActionBuilder) {
424         setVlanCfiActionBuilder.setVlanCfi(new VlanCfi(1));
425     }
426
427     private void prepareActionSetTpDst(SetTpDstActionBuilder setTpDstActionBuilder) {
428         setTpDstActionBuilder.setPort(new PortNumber(65535));
429     }
430
431     private void prepareActionSetTpSrc(SetTpSrcActionBuilder setTpSrcActionBuilder) {
432         setTpSrcActionBuilder.setPort(new PortNumber(65535));
433     }
434
435     private void prepareActionSetNwTos(SetNwTosActionBuilder setNwTosActionBuilder) {
436         setNwTosActionBuilder.setTos(63);
437     }
438
439     private void prepareActionSetNwSrc(List<Action> odActions) {
440         // test case for IPv4
441         SetNwSrcActionBuilder setNwSrcActionBuilderIpv4 = new SetNwSrcActionBuilder();
442         setNwSrcActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.102"));
443         odActions.add(new ActionBuilder().setAction(setNwSrcActionBuilderIpv4.build()).build());
444
445         // test case for IPv6
446         SetNwSrcActionBuilder setNwSrcActionBuilderIpv6 = new SetNwSrcActionBuilder();
447         setNwSrcActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7336"));
448         odActions.add(new ActionBuilder().setAction(setNwSrcActionBuilderIpv6.build()).build());
449     }
450
451     private void prepareActionSetNwDst(List<Action> odActions) {
452         // test case for IPv4
453         SetNwDstActionBuilder setNwDstActionBuilderIpv4 = new SetNwDstActionBuilder();
454         setNwDstActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.101"));
455         odActions.add(new ActionBuilder().setAction(setNwDstActionBuilderIpv4.build()).build());
456
457         // test case for IPv6
458         SetNwDstActionBuilder setNwDstActionBuilderIpv6 = new SetNwDstActionBuilder();
459         setNwDstActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7335"));
460         odActions.add(new ActionBuilder().setAction(setNwDstActionBuilderIpv6.build()).build());
461     }
462
463     private void prepareActionNextHop(List<Action> odActions) {
464         // test case for IPv4
465         SetNextHopActionBuilder setNextHopActionBuilderIpv4 = new SetNextHopActionBuilder();
466         setNextHopActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.100"));
467         odActions.add(new ActionBuilder().setAction(setNextHopActionBuilderIpv4.build()).build());
468
469         // test case for IPv6
470         SetNextHopActionBuilder setNextHopActionBuilderIpv6 = new SetNextHopActionBuilder();
471         setNextHopActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7334"));
472         odActions.add(new ActionBuilder().setAction(setNextHopActionBuilderIpv6.build()).build());
473     }
474
475     private Address prapareIpv4Address(String ipv4Address) {
476         Ipv4Builder ipv4Builder = new Ipv4Builder();
477         ipv4Builder.setIpv4Address(new Ipv4Prefix(ipv4Address));
478         return ipv4Builder.build();
479     }
480
481     private Address prapareIpv6Address(String ipv6Address) {
482         Ipv6Builder ipv6Builder = new Ipv6Builder();
483         ipv6Builder.setIpv6Address(new Ipv6Prefix(ipv6Address));
484         return ipv6Builder.build();
485     }
486
487     private void prepareActionSetDlType(SetDlTypeActionBuilder setDlTypeActionBuilder) {
488         setDlTypeActionBuilder.setDlType(new EtherType(513l));
489     }
490
491     private void prepareActionSetDlSrc(SetDlSrcActionBuilder setDlSrcActionBuilder) {
492         setDlSrcActionBuilder.setAddress(new MacAddress("24:77:03:7C:C5:F1"));
493     }
494
495     private void prepareActionSetDlDst(SetDlDstActionBuilder setDlDstActionBuilder) {
496         setDlDstActionBuilder.setAddress(new MacAddress("3C:A9:F4:00:E0:C8"));
497     }
498
499     private void prepareActionPushVlan(PushVlanActionBuilder pushVlanActionBuilder) {
500         pushVlanActionBuilder.setPcp(7); // 3 bits
501         pushVlanActionBuilder.setCfi(new VlanCfi(1)); // 1 bit
502         pushVlanActionBuilder.setVlanId(new VlanId(4095));
503         pushVlanActionBuilder.setTag(0x8100); // 12 bit
504     }
505
506     private void prepareActionOutput(OutputActionBuilder outputActionBuilder) {
507         List<Uri> uris = new ArrayList<>();
508         uris.add(new Uri("uri1"));
509         uris.add(new Uri("uri2"));
510         outputActionBuilder.setOutputNodeConnector(uris);
511     }
512
513     private Match prepOdMatch(MtchType mt) {
514         MatchBuilder odMatchBuilder = new MatchBuilder();
515         switch (mt) {
516         case other:
517             odMatchBuilder.setEthernetMatch(prepEthernetMatch());
518             odMatchBuilder.setIpMatch(prepIpMatch());
519             odMatchBuilder.setVlanMatch(prepVlanMatch());
520             break;
521         case ipv4:
522             odMatchBuilder.setLayer3Match(prepLayer3MatchIpv4());
523             break;
524         case ipv6:
525             odMatchBuilder.setLayer3Match(prepLayer3MatchIpv6());
526             break;
527         case arp:
528             odMatchBuilder.setLayer3Match(prepLayer3MatchArp());
529             break;
530         case sctp:
531             odMatchBuilder.setLayer4Match(prepLayer4MatchSctp());
532             break;
533         case tcp:
534             odMatchBuilder.setLayer4Match(prepLayer4MatchTcp());
535             break;
536         case udp:
537             odMatchBuilder.setLayer4Match(prepLayer4MatchUdp());
538             break;
539         }
540         return odMatchBuilder.build();
541     }
542
543     private Layer4Match prepLayer4MatchUdp() {
544         UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
545
546         udpMatchBuilder.setUdpSourcePort(new PortNumber(11));
547         udpMatchBuilder.setUdpDestinationPort(new PortNumber(12));
548
549         return udpMatchBuilder.build();
550     }
551
552     private Layer4Match prepLayer4MatchTcp() {
553         TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
554
555         tcpMatchBuilder.setTcpSourcePort(new PortNumber(21));
556         tcpMatchBuilder.setTcpDestinationPort(new PortNumber(22));
557
558         return tcpMatchBuilder.build();
559     }
560
561     private Layer4Match prepLayer4MatchSctp() {
562         SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
563
564         sctpMatchBuilder.setSctpSourcePort(new PortNumber(31));
565         sctpMatchBuilder.setSctpDestinationPort(new PortNumber(32));
566
567         return sctpMatchBuilder.build();
568     }
569
570     private Layer3Match prepLayer3MatchIpv4() {
571         Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
572         ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("192.168.1.104"));
573         ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("192.168.1.105"));
574         return ipv4MatchBuilder.build();
575     }
576
577     private Layer3Match prepLayer3MatchIpv6() {
578         Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder();
579         ipv6MatchBuilder.setIpv6Source(new Ipv6Prefix("3001:0db8:85a3:0000:0000:8a2e:0370:7334"));
580         ipv6MatchBuilder.setIpv6Destination(new Ipv6Prefix("3001:0db8:85a3:0000:0000:8a2e:0370:7335"));
581         return ipv6MatchBuilder.build();
582     }
583
584     private Layer3Match prepLayer3MatchArp() {
585         ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
586         arpMatchBuilder.setArpSourceTransportAddress(new Ipv4Prefix("192.168.1.101"));
587         arpMatchBuilder.setArpTargetTransportAddress(new Ipv4Prefix("192.168.1.102"));
588
589         ArpSourceHardwareAddressBuilder arpSourAddressBuild = new ArpSourceHardwareAddressBuilder();
590         arpSourAddressBuild.setAddress(new MacAddress("22:44:66:88:AA:CC"));
591         arpMatchBuilder.setArpSourceHardwareAddress(arpSourAddressBuild.build());
592
593         ArpTargetHardwareAddressBuilder arpTarAddressBuild = new ArpTargetHardwareAddressBuilder();
594         arpTarAddressBuild.setAddress(new MacAddress("11:33:55:77:BB:DD"));
595         arpMatchBuilder.setArpTargetHardwareAddress(arpTarAddressBuild.build());
596         return arpMatchBuilder.build();
597     }
598
599     private VlanMatch prepVlanMatch() {
600         VlanMatchBuilder vlanMatchBuilder = new VlanMatchBuilder();
601
602         VlanIdBuilder vlanIdBuilder = new VlanIdBuilder().setVlanId(new VlanId(0xfff));
603         vlanMatchBuilder.setVlanId(vlanIdBuilder.build());
604         vlanMatchBuilder.setVlanPcp(new VlanPcp((short) 0x7));
605
606         return vlanMatchBuilder.build();
607
608     }
609
610     private IpMatch prepIpMatch() {
611         IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();
612         ipMatchBuilder.setIpDscp(new Dscp((short) 0x33));
613         ipMatchBuilder.setIpProtocol((short) 0x3f);
614         return ipMatchBuilder.build();
615     }
616
617     private EthernetMatch prepEthernetMatch() {
618         EthernetMatchBuilder odEthernetMatchBuilder = new EthernetMatchBuilder();
619         odEthernetMatchBuilder.setEthernetDestination(prepEthDest());
620         odEthernetMatchBuilder.setEthernetSource(prepEthSour());
621         odEthernetMatchBuilder.setEthernetType(prepEthType());
622         return odEthernetMatchBuilder.build();
623     }
624
625     private EthernetType prepEthType() {
626         EthernetTypeBuilder ethTypeBuild = new EthernetTypeBuilder();
627         ethTypeBuild.setType(new EtherType(0xffffl));
628         return ethTypeBuild.build();
629     }
630
631     private EthernetSource prepEthSour() {
632         EthernetSourceBuilder ethSourBuild = new EthernetSourceBuilder();
633         ethSourBuild.setAddress(new MacAddress("24:77:03:7C:C5:F1"));
634         return ethSourBuild.build();
635     }
636
637     private EthernetDestination prepEthDest() {
638         EthernetDestinationBuilder ethDestBuild = new EthernetDestinationBuilder();
639         ethDestBuild.setAddress(new MacAddress("3C:A9:F4:00:E0:C8"));
640         return ethDestBuild.build();
641     }
642 }