Merge "BUG-2091: notification NodeRemoved and processing queue"
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / translator / FlowRemovedTranslatorTest.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 package org.opendaylight.openflowplugin.openflow.md.core.translator;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.mockito.Mockito.when;
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 org.junit.Before;
20 import org.junit.Test;
21 import org.junit.runner.RunWith;
22 import org.mockito.MockitoAnnotations;
23 import org.mockito.runners.MockitoJUnitRunner;
24 import org.opendaylight.openflowplugin.api.OFConstants;
25 import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;
26 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
27 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
28 import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl;
29 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
30 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionManagerOFImpl;
31 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6FlowLabel;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.mod.removed.Match;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ProtocolMatchFields;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4Match;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6Match;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntryBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntryBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntryBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntryBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntryBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntryBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntryBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntryBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntry;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntryBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntry;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntryBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntryBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntryBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntryBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntryBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntryBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntryBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntryBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntryBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntryBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntryBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntryBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntryBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntryBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntryBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpOp;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSha;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSpa;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTha;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTpa;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthType;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Code;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Type;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Code;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Type;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdSll;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTll;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelIpv4Dst;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelIpv4Src;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.MatchBuilder;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessage;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
125 import org.opendaylight.yangtools.yang.binding.Augmentation;
126 import org.opendaylight.yangtools.yang.binding.DataObject;
127
128 @RunWith(MockitoJUnitRunner.class)
129 public class FlowRemovedTranslatorTest extends FlowRemovedTranslator {
130
131     private static final FlowRemovedTranslator flowRemovedTranslator = new FlowRemovedTranslator();
132     private static final BigInteger DATA_PATH_ID = BigInteger.valueOf(42);
133
134     @MockitoAnnotations.Mock
135     SwitchConnectionDistinguisher switchConnectionDistinguisher;
136
137     @MockitoAnnotations.Mock
138     SessionContext sessionContext;
139
140     @MockitoAnnotations.Mock
141     FlowRemovedMessage msg;
142
143     @MockitoAnnotations.Mock
144     ConnectionConductor connectionConductor;
145
146     @MockitoAnnotations.Mock
147     GetFeaturesOutput featuresOutput;
148
149     private static final MacAddress MAC_ADDRESS = new MacAddress("00:01:02:03:04:05");
150
151
152     private static Map<Class<? extends MatchField>, Object> fieldClassesAndAugmentations = new HashMap<>();
153
154     private void setupClassAndAugmentationMap() {
155
156         PortNumberMatchEntryBuilder portNumberMatchEntryBuilder = new PortNumberMatchEntryBuilder();
157         portNumberMatchEntryBuilder.setPortNumber(new PortNumber((long) 42));
158         fieldClassesAndAugmentations.put(InPort.class, portNumberMatchEntryBuilder.build());
159         fieldClassesAndAugmentations.put(InPhyPort.class, portNumberMatchEntryBuilder.build());
160
161         MetadataMatchEntryBuilder metadataMatchEntryBuilder = new MetadataMatchEntryBuilder();
162         metadataMatchEntryBuilder.setMetadata(new byte[0]);
163         fieldClassesAndAugmentations.put(Metadata.class, metadataMatchEntryBuilder.build());
164
165         MaskMatchEntryBuilder maskMatchEntryBuilder = new MaskMatchEntryBuilder();
166         maskMatchEntryBuilder.setMask(new byte[24]);
167
168         EthTypeMatchEntryBuilder ethTypeMatchEntryBuilder = new EthTypeMatchEntryBuilder();
169         ethTypeMatchEntryBuilder.setEthType(new EtherType(6));
170         fieldClassesAndAugmentations.put(EthType.class, ethTypeMatchEntryBuilder.build());
171
172         VlanVidMatchEntryBuilder vlanVidMatchEntryBuilder = new VlanVidMatchEntryBuilder();
173         vlanVidMatchEntryBuilder.setCfiBit(true);
174         vlanVidMatchEntryBuilder.setVlanVid(42);
175         fieldClassesAndAugmentations.put(VlanVid.class, vlanVidMatchEntryBuilder.build());
176
177         VlanPcpMatchEntryBuilder vlanPcpMatchEntryBuilder = new VlanPcpMatchEntryBuilder();
178         vlanPcpMatchEntryBuilder.setVlanPcp((short) 7);
179         fieldClassesAndAugmentations.put(VlanPcp.class, vlanPcpMatchEntryBuilder.build());
180
181         DscpMatchEntryBuilder dscpMatchEntryBuilder = new DscpMatchEntryBuilder();
182         dscpMatchEntryBuilder.setDscp(new Dscp((short) 10));
183         fieldClassesAndAugmentations.put(IpDscp.class, dscpMatchEntryBuilder.build());
184
185         EcnMatchEntryBuilder ecnMatchEntryBuilder = new EcnMatchEntryBuilder();
186         ecnMatchEntryBuilder.setEcn((short) 10);
187         fieldClassesAndAugmentations.put(IpEcn.class, ecnMatchEntryBuilder.build());
188
189         ProtocolNumberMatchEntryBuilder protocolNumberMatchEntryBuilder = new ProtocolNumberMatchEntryBuilder();
190         protocolNumberMatchEntryBuilder.setProtocolNumber(OFConstants.OFP_VERSION_1_3);
191         fieldClassesAndAugmentations.put(IpProto.class, protocolNumberMatchEntryBuilder.build());
192
193         PortMatchEntryBuilder portMatchEntryBuilder = new PortMatchEntryBuilder();
194         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber port = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber(43);
195         portMatchEntryBuilder.setPort(port);
196         fieldClassesAndAugmentations.put(TcpSrc.class, portMatchEntryBuilder.build());
197         fieldClassesAndAugmentations.put(TcpDst.class, portMatchEntryBuilder.build());
198         fieldClassesAndAugmentations.put(UdpSrc.class, portMatchEntryBuilder.build());
199         fieldClassesAndAugmentations.put(UdpDst.class, portMatchEntryBuilder.build());
200         fieldClassesAndAugmentations.put(SctpSrc.class, portMatchEntryBuilder.build());
201         fieldClassesAndAugmentations.put(SctpDst.class, portMatchEntryBuilder.build());
202
203         Icmpv4TypeMatchEntryBuilder icmpv4TypeMatchEntryBuilder = new Icmpv4TypeMatchEntryBuilder();
204         icmpv4TypeMatchEntryBuilder.setIcmpv4Type((short) 10);
205         fieldClassesAndAugmentations.put(Icmpv4Type.class, icmpv4TypeMatchEntryBuilder.build());
206
207         Icmpv4CodeMatchEntryBuilder icmpv4CodeMatchEntryBuilder = new Icmpv4CodeMatchEntryBuilder();
208         icmpv4CodeMatchEntryBuilder.setIcmpv4Code((short) 10);
209         fieldClassesAndAugmentations.put(Icmpv4Code.class, icmpv4CodeMatchEntryBuilder.build());
210
211         Icmpv6TypeMatchEntryBuilder icmpv6TypeMatchEntryBuilder = new Icmpv6TypeMatchEntryBuilder();
212         icmpv6TypeMatchEntryBuilder.setIcmpv6Type((short) 10);
213         fieldClassesAndAugmentations.put(Icmpv6Type.class, icmpv6TypeMatchEntryBuilder.build());
214
215         Icmpv6CodeMatchEntryBuilder icmpv6CodeMatchEntryBuilder = new Icmpv6CodeMatchEntryBuilder();
216         icmpv6CodeMatchEntryBuilder.setIcmpv6Code((short) 10);
217         fieldClassesAndAugmentations.put(Icmpv6Code.class, icmpv6CodeMatchEntryBuilder.build());
218
219
220         OpCodeMatchEntryBuilder opCodeMatchEntryBuilder = new OpCodeMatchEntryBuilder();
221         opCodeMatchEntryBuilder.setOpCode(42);
222         fieldClassesAndAugmentations.put(ArpOp.class, opCodeMatchEntryBuilder.build());
223
224
225         MacAddressMatchEntryBuilder macAddressMatchEntryBuilder = new MacAddressMatchEntryBuilder();
226         macAddressMatchEntryBuilder.setMacAddress(MAC_ADDRESS);
227         fieldClassesAndAugmentations.put(ArpSha.class, macAddressMatchEntryBuilder.build());
228         fieldClassesAndAugmentations.put(ArpTha.class, macAddressMatchEntryBuilder.build());
229         fieldClassesAndAugmentations.put(EthDst.class, macAddressMatchEntryBuilder.build());
230         fieldClassesAndAugmentations.put(EthSrc.class, macAddressMatchEntryBuilder.build());
231
232
233         Ipv6FlabelMatchEntryBuilder ipv6FlabelMatchEntryBuilder = new Ipv6FlabelMatchEntryBuilder();
234         ipv6FlabelMatchEntryBuilder.setIpv6Flabel(new Ipv6FlowLabel((long) 42));
235         fieldClassesAndAugmentations.put(Ipv6Flabel.class, ipv6FlabelMatchEntryBuilder.build());
236
237         Ipv6AddressMatchEntryBuilder ipv6AddressMatchEntryBuilder = new Ipv6AddressMatchEntryBuilder();
238         ipv6AddressMatchEntryBuilder.setIpv6Address(new Ipv6Address("2001:0DB8:AC10:FE01:0000:0000:0000:0000"));
239         fieldClassesAndAugmentations.put(Ipv6NdTarget.class, ipv6AddressMatchEntryBuilder.build());
240
241         fieldClassesAndAugmentations.put(Ipv6NdSll.class, macAddressMatchEntryBuilder.build());
242         fieldClassesAndAugmentations.put(Ipv6NdTll.class, macAddressMatchEntryBuilder.build());
243         fieldClassesAndAugmentations.put(Ipv6Exthdr.class, macAddressMatchEntryBuilder.build());
244
245         PseudoFieldMatchEntryBuilder pseudoFieldMatchEntryBuilder = new PseudoFieldMatchEntryBuilder();
246         pseudoFieldMatchEntryBuilder.setPseudoField(new Ipv6ExthdrFlags(true, true, true, true, true, true, true, true, true));
247         fieldClassesAndAugmentations.put(Ipv6Exthdr.class, pseudoFieldMatchEntryBuilder.build());
248
249         MplsLabelMatchEntryBuilder mplsLabelMatchEntryBuilder = new MplsLabelMatchEntryBuilder();
250         mplsLabelMatchEntryBuilder.setMplsLabel((long) 42);
251         fieldClassesAndAugmentations.put(MplsLabel.class, mplsLabelMatchEntryBuilder.build());
252
253         TcMatchEntryBuilder tcMatchEntryBuilder = new TcMatchEntryBuilder();
254         tcMatchEntryBuilder.setTc((short) 0);
255         fieldClassesAndAugmentations.put(MplsTc.class, tcMatchEntryBuilder.build());
256
257         BosMatchEntryBuilder bosMatchEntryBuilder = new BosMatchEntryBuilder();
258         bosMatchEntryBuilder.setBos(false);
259         fieldClassesAndAugmentations.put(MplsBos.class, bosMatchEntryBuilder.build());
260
261         IsidMatchEntryBuilder isidMatchEntryBuilder = new IsidMatchEntryBuilder();
262         isidMatchEntryBuilder.setIsid((long) 42);
263         fieldClassesAndAugmentations.put(PbbIsid.class, isidMatchEntryBuilder.build());
264
265         fieldClassesAndAugmentations.put(TunnelId.class, metadataMatchEntryBuilder.build());
266
267         Ipv4AddressMatchEntryBuilder ipv4AddressMatchEntryBuilder = new Ipv4AddressMatchEntryBuilder();
268         ipv4AddressMatchEntryBuilder.setIpv4Address(new Ipv4Address("10.0.0.1/24"));
269         fieldClassesAndAugmentations.put(ArpTpa.class, ipv4AddressMatchEntryBuilder.build());
270         fieldClassesAndAugmentations.put(ArpSpa.class, ipv4AddressMatchEntryBuilder.build());
271
272         fieldClassesAndAugmentations.put(Ipv4Src.class, ipv4AddressMatchEntryBuilder.build());
273         fieldClassesAndAugmentations.put(Ipv4Dst.class, ipv4AddressMatchEntryBuilder.build());
274
275
276         fieldClassesAndAugmentations.put(TunnelIpv4Src.class, ipv4AddressMatchEntryBuilder.build());
277         fieldClassesAndAugmentations.put(TunnelIpv4Dst.class, ipv4AddressMatchEntryBuilder.build());
278         fieldClassesAndAugmentations.put(Ipv6Src.class, ipv6AddressMatchEntryBuilder.build());
279         fieldClassesAndAugmentations.put(Ipv6Dst.class, ipv6AddressMatchEntryBuilder.build());
280     }
281
282
283     @Before
284     public void setup() {
285         when(sessionContext.getPrimaryConductor()).thenReturn(connectionConductor);
286         when(connectionConductor.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
287         when(sessionContext.getFeatures()).thenReturn(featuresOutput);
288         when(featuresOutput.getDatapathId()).thenReturn(DATA_PATH_ID);
289         OpenflowPortsUtil.init();
290         ExtensionConverterManagerImpl extensionConverterProvider = new ExtensionConverterManagerImpl();
291         //extensionConverterProvider.registerMatchConvertor()
292         SessionManagerOFImpl.getInstance().setExtensionConverterProvider(extensionConverterProvider);
293     }
294
295     @Test
296     public void testTranslate() throws Exception {
297         List<DataObject> dataObjectList = flowRemovedTranslator.translate(switchConnectionDistinguisher, sessionContext, msg);
298         assertNotNull(dataObjectList);
299     }
300
301     @Test
302     public void testFromMatch() throws Exception {
303         setupClassAndAugmentationMap();
304         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.MatchBuilder matchBuilder = new MatchBuilder();
305         List<MatchEntries> matchEntrieses = new ArrayList<>();
306         for (Map.Entry entry : fieldClassesAndAugmentations.entrySet()) {
307             MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder();
308             matchEntriesBuilder.setOxmMatchField((Class<? extends MatchField>) entry.getKey());
309             if (entry.getValue() != null) {
310                 matchEntriesBuilder.addAugmentation((Class<? extends Augmentation<MatchEntries>>) entry.getValue().getClass().getInterfaces()[0], (Augmentation<MatchEntries>) entry.getValue());
311             }
312             matchEntriesBuilder.setHasMask(false);
313             matchEntrieses.add(matchEntriesBuilder.build());
314         }
315         matchBuilder.setMatchEntries(matchEntrieses);
316         Match match = flowRemovedTranslator.fromMatch(matchBuilder.build(), DATA_PATH_ID, OpenflowVersion.OF13);
317         assertNotNull(match);
318         assertEthernetMatch(match.getEthernetMatch());
319         assertIcmpV4Match(match.getIcmpv4Match());
320
321         assertEquals("openflow:42:42", match.getInPhyPort().getValue());
322         assertEquals("openflow:42:42", match.getInPort().getValue());
323         assertIpMatch(match.getIpMatch());
324
325         assertNotNull(match.getLayer3Match());
326         assertNotNull(match.getLayer4Match());
327
328         assertProtocolMatchFields(match.getProtocolMatchFields());
329
330         assertMetada(match.getMetadata());
331
332         assertTunnelMatch(match.getTunnel());
333
334         assertVlanMatch(match.getVlanMatch());
335     }
336
337     private void assertTunnelMatch(Tunnel tunnel) {
338         assertEquals(0, tunnel.getTunnelId().intValue());
339     }
340
341     private void assertVlanMatch(VlanMatch vlanMatch) {
342         assertEquals(true, vlanMatch.getVlanId().isVlanIdPresent());
343         assertEquals(new Integer(42), vlanMatch.getVlanId().getVlanId().getValue());
344
345         assertEquals((short) 7, vlanMatch.getVlanPcp().getValue().shortValue());
346     }
347
348     private void assertMetada(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata) {
349         assertEquals(0, metadata.getMetadata().intValue());
350     }
351
352     private void assertProtocolMatchFields(ProtocolMatchFields protocolMatchFields) {
353         assertEquals((short) 0, protocolMatchFields.getMplsBos().shortValue());
354         assertEquals(42, protocolMatchFields.getMplsLabel().longValue());
355         assertEquals((short) 0, protocolMatchFields.getMplsTc().shortValue());
356         assertEquals(42, protocolMatchFields.getPbb().getPbbIsid().longValue());
357     }
358
359     private void assertIpMatch(IpMatch ipMatch) {
360         assertEquals(10, ipMatch.getIpDscp().getValue().longValue());
361         assertEquals(10, ipMatch.getIpEcn().shortValue());
362         assertEquals(4, ipMatch.getIpProtocol().shortValue());
363     }
364
365     private void assertIcmpV4Match(Icmpv4Match icmpv4Match) {
366         assertEquals(10, icmpv4Match.getIcmpv4Code().longValue());
367         assertEquals(10, icmpv4Match.getIcmpv4Type().longValue());
368     }
369
370     private void assertEthernetMatch(EthernetMatch ethernetMatch) {
371         assertEquals(MAC_ADDRESS, ethernetMatch.getEthernetDestination().getAddress());
372         assertEquals(MAC_ADDRESS, ethernetMatch.getEthernetSource().getAddress());
373         assertEquals(new Long(6), ethernetMatch.getEthernetType().getType().getValue());
374     }
375
376     @Test
377     public void MatchEntryToIpv4PrefixTest() {
378         Ipv4AddressMatchEntry ipv4AddressMatchEntry = new Ipv4AddressMatchEntryBuilder()
379                 .setIpv4Address(new Ipv4Address("10.0.0.0")).build();
380         byte[] maskBytes = new byte[1];
381         maskBytes[0] = (byte) 255;
382         MaskMatchEntry maskMatchEntry = new MaskMatchEntryBuilder().setMask(maskBytes).build();
383         MatchEntries entry = new MatchEntriesBuilder().setOxmMatchField(Ipv4Src.class)
384                 .addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressMatchEntry)
385                 .addAugmentation(MaskMatchEntry.class, maskMatchEntry).setHasMask(true).build();
386         Ipv4Prefix ipv4Prefix = toIpv4Prefix(entry);
387         assertEquals("10.0.0.0/8", ipv4Prefix.getValue());
388     }
389
390     @Test
391     public void MatchEntryToIpv6PrefixTest() {
392         Ipv6AddressMatchEntry ipv6AddressMatchEntry = new Ipv6AddressMatchEntryBuilder()
393                 .setIpv6Address(new Ipv6Address("1234:5678:9ABC:DEF0:FDCD:A987:6543:0")).build();
394         byte[] maskBytes = new byte[1];
395         maskBytes[0] = (byte) 255;
396         MaskMatchEntry maskMatchEntry = new MaskMatchEntryBuilder().setMask(maskBytes).build();
397         MatchEntries entry = new MatchEntriesBuilder().setOxmMatchField(Ipv6Src.class)
398                 .addAugmentation(Ipv6AddressMatchEntry.class, ipv6AddressMatchEntry)
399                 .addAugmentation(MaskMatchEntry.class, maskMatchEntry).setHasMask(true).build();
400         Ipv6Prefix ipv6Prefix = toIpv6Prefix(entry);
401         assertEquals("1234:5678:9ABC:DEF0:FDCD:A987:6543:0/8", ipv6Prefix.getValue());
402     }
403
404 }