Remove redundant exception declarations
[openflowplugin.git] / openflowjava / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / FlowModInputMessageFactoryTest.java
1 /*
2  * Copyright (c) 2015 NetIDE Consortium 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.openflowjava.protocol.impl.deserialization.factories;
9
10 import io.netty.buffer.ByteBuf;
11 import java.math.BigInteger;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
18 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
19 import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
20 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
21 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;
22 import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.ApplyActionsCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.GotoTableCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteMetadataCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice._goto.table._case.GotoTableBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.apply.actions._case.ApplyActionsBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.write.metadata._case.WriteMetadataBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.InstructionBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModCommand;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.phy.port._case.InPhyPortBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcnBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
52
53 /**
54  * Unit tests for FlowModInputMessageFactory.
55  *
56  * @author giuseppex.petralia@intel.com
57  */
58 public class FlowModInputMessageFactoryTest {
59     private OFDeserializer<FlowModInput> flowFactory;
60
61     /**
62      * Initializes deserializer registry and lookups correct deserializer.
63      */
64     @Before
65     public void startUp() {
66         DeserializerRegistry registry = new DeserializerRegistryImpl();
67         registry.init();
68         flowFactory = registry
69                 .getDeserializer(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID, 14, FlowModInput.class));
70     }
71
72     @Test
73     public void test() {
74         ByteBuf bb = BufferHelper.buildBuffer(
75             "ff 01 04 01 06 00 07 01 ff 05 00 00 09 30 00 30 41 02 00 0c 00 00 00 7e 00 "
76             + "00 00 02 00 00 11 46 00 00 00 62 00 0b 00 00 00 01 00 11 80 00 02 04 00 00 00 2a 80 00 12 01 04 00 "
77             + "00 00 00 00 00 00 00 01 00 08 2b 00 00 00 00 02 00 18 00 00 00 00 ff 01 04 01 06 00 07 01 ff 05 00 00 "
78             + "09 30 00 30 00 04 00 18 00 00 00 00 00 00 00 10 00 00 00 2a 00 34 00 00 00 00 00 00");
79         FlowModInput deserializedMessage = BufferHelper.deserialize(flowFactory, bb);
80         BufferHelper.checkHeaderV13(deserializedMessage);
81         byte[] cookie = new byte[] { (byte) 0xFF, 0x01, 0x04, 0x01, 0x06, 0x00, 0x07, 0x01 };
82         Assert.assertEquals("Wrong cookie", new BigInteger(1, cookie), deserializedMessage.getCookie());
83         byte[] cookieMask = new byte[] { (byte) 0xFF, 0x05, 0x00, 0x00, 0x09, 0x30, 0x00, 0x30 };
84         Assert.assertEquals("Wrong cookie mask", new BigInteger(1, cookieMask), deserializedMessage.getCookieMask());
85         Assert.assertEquals("Wrong table id", new TableId(65L), deserializedMessage.getTableId());
86         Assert.assertEquals("Wrong command", FlowModCommand.forValue(2), deserializedMessage.getCommand());
87         Assert.assertEquals("Wrong idle timeout", 12, deserializedMessage.getIdleTimeout().intValue());
88         Assert.assertEquals("Wrong hard timeout", 0, deserializedMessage.getHardTimeout().intValue());
89         Assert.assertEquals("Wrong priority", 126, deserializedMessage.getPriority().intValue());
90         Assert.assertEquals("Wrong buffer id ", 2L, deserializedMessage.getBufferId().longValue());
91         Assert.assertEquals("Wrong out port", new PortNumber(4422L), deserializedMessage.getOutPort());
92         Assert.assertEquals("Wrong out group", 98L, deserializedMessage.getOutGroup().longValue());
93         Assert.assertEquals("Wrong flags", new FlowModFlags(true, false, true, false, true),
94                 deserializedMessage.getFlags());
95         Assert.assertEquals("Wrong match", createMatch(), deserializedMessage.getMatch());
96         Assert.assertEquals("Wrong instructions", createInstructions(), deserializedMessage.getInstruction());
97
98     }
99
100     private List<Instruction> createInstructions() {
101         final List<Instruction> instructions = new ArrayList<>();
102         InstructionBuilder insBuilder = new InstructionBuilder();
103         GotoTableCaseBuilder goToCaseBuilder = new GotoTableCaseBuilder();
104         GotoTableBuilder instructionBuilder = new GotoTableBuilder();
105         instructionBuilder.setTableId((short) 43);
106         goToCaseBuilder.setGotoTable(instructionBuilder.build());
107         insBuilder.setInstructionChoice(goToCaseBuilder.build());
108         instructions.add(insBuilder.build());
109         WriteMetadataCaseBuilder metadataCaseBuilder = new WriteMetadataCaseBuilder();
110         WriteMetadataBuilder metadataBuilder = new WriteMetadataBuilder();
111         byte[] metadata = new byte[] { (byte) 0xFF, 0x01, 0x04, 0x01, 0x06, 0x00, 0x07, 0x01 };
112         metadataBuilder.setMetadata(metadata);
113         byte[] metadataMask = new byte[] { (byte) 0xFF, 0x05, 0x00, 0x00, 0x09, 0x30, 0x00, 0x30 };
114         metadataBuilder.setMetadataMask(metadataMask);
115         metadataCaseBuilder.setWriteMetadata(metadataBuilder.build());
116         insBuilder.setInstructionChoice(metadataCaseBuilder.build());
117         instructions.add(insBuilder.build());
118         insBuilder = new InstructionBuilder();
119         final ApplyActionsCaseBuilder applyActionsCaseBuilder = new ApplyActionsCaseBuilder();
120         final ApplyActionsBuilder actionsBuilder = new ApplyActionsBuilder();
121         final List<Action> actions = new ArrayList<>();
122         final ActionBuilder actionBuilder = new ActionBuilder();
123         OutputActionCaseBuilder caseBuilder = new OutputActionCaseBuilder();
124         OutputActionBuilder outputBuilder = new OutputActionBuilder();
125         outputBuilder.setPort(new PortNumber(42L));
126         outputBuilder.setMaxLength(52);
127         caseBuilder.setOutputAction(outputBuilder.build());
128         actionBuilder.setActionChoice(caseBuilder.build());
129         actions.add(actionBuilder.build());
130         actionsBuilder.setAction(actions);
131         applyActionsCaseBuilder.setApplyActions(actionsBuilder.build());
132         insBuilder.setInstructionChoice(applyActionsCaseBuilder.build());
133         instructions.add(insBuilder.build());
134         return instructions;
135     }
136
137     private Match createMatch() {
138         MatchBuilder matchBuilder = new MatchBuilder();
139         matchBuilder.setType(OxmMatchType.class);
140         final List<MatchEntry> entries = new ArrayList<>();
141         MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();
142         entriesBuilder.setOxmClass(OpenflowBasicClass.class);
143         entriesBuilder.setOxmMatchField(InPhyPort.class);
144         entriesBuilder.setHasMask(false);
145         InPhyPortCaseBuilder inPhyPortCaseBuilder = new InPhyPortCaseBuilder();
146         InPhyPortBuilder inPhyPortBuilder = new InPhyPortBuilder();
147         inPhyPortBuilder.setPortNumber(new PortNumber(42L));
148         inPhyPortCaseBuilder.setInPhyPort(inPhyPortBuilder.build());
149         entriesBuilder.setMatchEntryValue(inPhyPortCaseBuilder.build());
150         entries.add(entriesBuilder.build());
151         entriesBuilder.setOxmClass(OpenflowBasicClass.class);
152         entriesBuilder.setOxmMatchField(IpEcn.class);
153         entriesBuilder.setHasMask(false);
154         IpEcnCaseBuilder ipEcnCaseBuilder = new IpEcnCaseBuilder();
155         IpEcnBuilder ipEcnBuilder = new IpEcnBuilder();
156         ipEcnBuilder.setEcn((short) 4);
157         ipEcnCaseBuilder.setIpEcn(ipEcnBuilder.build());
158         entriesBuilder.setMatchEntryValue(ipEcnCaseBuilder.build());
159         entries.add(entriesBuilder.build());
160         matchBuilder.setMatchEntry(entries);
161         return matchBuilder.build();
162     }
163
164 }