Migrate openflow-protocol-impl isFoo() users
[openflowplugin.git] / openflowjava / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / util / OF13InstructionsSerializerTest.java
1 /*
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. 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.util;
9
10 import io.netty.buffer.ByteBuf;
11 import io.netty.buffer.UnpooledByteBufAllocator;
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.SerializerRegistry;
18 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
19 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
20 import org.opendaylight.openflowjava.util.ByteBufUtils;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopPbbCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushVlanCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTtlCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.push.vlan._case.PushVlanActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.nw.ttl._case.SetNwTtlActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.ApplyActionsCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.ClearActionsCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.GotoTableCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.MeterCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteActionsCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteMetadataCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice._goto.table._case.GotoTableBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.apply.actions._case.ApplyActionsBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.meter._case.MeterBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.write.actions._case.WriteActionsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.write.metadata._case.WriteMetadataBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.InstructionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
45 import org.opendaylight.yangtools.yang.common.Uint16;
46 import org.opendaylight.yangtools.yang.common.Uint32;
47 import org.opendaylight.yangtools.yang.common.Uint8;
48
49 /**
50  * Unit tests for OF13InstructionsSerializer.
51  *
52  * @author michal.polkorab
53  */
54 public class OF13InstructionsSerializerTest {
55
56     private SerializerRegistry registry;
57
58     /**
59      * Initializes serializer table and stores correct factory in field.
60      */
61     @Before
62     public void startUp() {
63         registry = new SerializerRegistryImpl();
64         registry.init();
65     }
66
67     /**
68      * Testing instructions translation.
69      */
70     @Test
71     public void test() {
72         final List<Instruction> instructions = new ArrayList<>();
73         // Goto_table instruction
74         InstructionBuilder builder = new InstructionBuilder();
75         GotoTableCaseBuilder gotoCaseBuilder = new GotoTableCaseBuilder();
76         GotoTableBuilder instructionBuilder = new GotoTableBuilder();
77         instructionBuilder.setTableId(Uint8.valueOf(5));
78         gotoCaseBuilder.setGotoTable(instructionBuilder.build());
79         builder.setInstructionChoice(gotoCaseBuilder.build());
80         instructions.add(builder.build());
81         // Write_metadata instruction
82         builder = new InstructionBuilder();
83         WriteMetadataCaseBuilder metadataCaseBuilder = new WriteMetadataCaseBuilder();
84         WriteMetadataBuilder metadataBuilder = new WriteMetadataBuilder();
85         metadataBuilder.setMetadata(ByteBufUtils.hexStringToBytes("00 01 02 03 04 05 06 07"));
86         metadataBuilder.setMetadataMask(ByteBufUtils.hexStringToBytes("07 06 05 04 03 02 01 00"));
87         metadataCaseBuilder.setWriteMetadata(metadataBuilder.build());
88         builder.setInstructionChoice(metadataCaseBuilder.build());
89         instructions.add(builder.build());
90         // Clear_actions instruction
91         builder = new InstructionBuilder();
92         builder.setInstructionChoice(new ClearActionsCaseBuilder().build());
93         instructions.add(builder.build());
94         // Meter instruction
95         builder = new InstructionBuilder();
96         MeterCaseBuilder meterCaseBuilder = new MeterCaseBuilder();
97         MeterBuilder meterBuilder = new MeterBuilder();
98         meterBuilder.setMeterId(Uint32.valueOf(42));
99         meterCaseBuilder.setMeter(meterBuilder.build());
100         builder.setInstructionChoice(meterCaseBuilder.build());
101         instructions.add(builder.build());
102         // Write_actions instruction
103         builder = new InstructionBuilder();
104         final WriteActionsCaseBuilder writeActionsCaseBuilder = new WriteActionsCaseBuilder();
105         final WriteActionsBuilder writeActionsBuilder = new WriteActionsBuilder();
106         OutputActionCaseBuilder caseBuilder = new OutputActionCaseBuilder();
107         OutputActionBuilder outputBuilder = new OutputActionBuilder();
108         outputBuilder.setPort(new PortNumber(Uint32.valueOf(45)));
109         outputBuilder.setMaxLength(Uint16.valueOf(55));
110         caseBuilder.setOutputAction(outputBuilder.build());
111         ActionBuilder actionBuilder = new ActionBuilder();
112         actionBuilder.setActionChoice(caseBuilder.build());
113         List<Action> actions = new ArrayList<>();
114         actions.add(actionBuilder.build());
115         actionBuilder = new ActionBuilder();
116         SetNwTtlCaseBuilder ttlCaseBuilder = new SetNwTtlCaseBuilder();
117         SetNwTtlActionBuilder ttlActionBuilder = new SetNwTtlActionBuilder();
118         ttlActionBuilder.setNwTtl(Uint8.valueOf(64));
119         ttlCaseBuilder.setSetNwTtlAction(ttlActionBuilder.build());
120         actionBuilder.setActionChoice(ttlCaseBuilder.build());
121         actions.add(actionBuilder.build());
122         writeActionsBuilder.setAction(actions);
123         writeActionsCaseBuilder.setWriteActions(writeActionsBuilder.build());
124         builder.setInstructionChoice(writeActionsCaseBuilder.build());
125         instructions.add(builder.build());
126         // Apply_actions instruction
127         builder = new InstructionBuilder();
128         final ApplyActionsCaseBuilder applyActionsCaseBuilder = new ApplyActionsCaseBuilder();
129         final ApplyActionsBuilder applyActionsBuilder = new ApplyActionsBuilder();
130         actions = new ArrayList<>();
131         actionBuilder = new ActionBuilder();
132         PushVlanCaseBuilder vlanCaseBuilder = new PushVlanCaseBuilder();
133         PushVlanActionBuilder vlanBuilder = new PushVlanActionBuilder();
134         vlanBuilder.setEthertype(new EtherType(new EtherType(Uint16.valueOf(14))));
135         vlanCaseBuilder.setPushVlanAction(vlanBuilder.build());
136         actionBuilder.setActionChoice(vlanCaseBuilder.build());
137         actions.add(actionBuilder.build());
138         actionBuilder = new ActionBuilder();
139         actionBuilder.setActionChoice(new PopPbbCaseBuilder().build());
140         actions.add(actionBuilder.build());
141         applyActionsBuilder.setAction(actions);
142         applyActionsCaseBuilder.setApplyActions(applyActionsBuilder.build());
143         builder.setInstructionChoice(applyActionsCaseBuilder.build());
144         instructions.add(builder.build());
145
146         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
147         ListSerializer.serializeList(instructions, TypeKeyMakerFactory
148                 .createInstructionKeyMaker(EncodeConstants.OF13_VERSION_ID), registry, out);
149
150         Assert.assertEquals("Wrong instruction type", 1, out.readUnsignedShort());
151         Assert.assertEquals("Wrong instruction length", 8, out.readUnsignedShort());
152         Assert.assertEquals("Wrong instruction table-id", 5, out.readUnsignedByte());
153         out.skipBytes(3);
154         Assert.assertEquals("Wrong instruction type", 2, out.readUnsignedShort());
155         Assert.assertEquals("Wrong instruction length", 24, out.readUnsignedShort());
156         out.skipBytes(4);
157         byte[] actual = new byte[8];
158         out.readBytes(actual);
159         Assert.assertEquals("Wrong instruction metadata", "00 01 02 03 04 05 06 07",
160                 ByteBufUtils.bytesToHexString(actual));
161         actual = new byte[8];
162         out.readBytes(actual);
163         Assert.assertEquals("Wrong instruction metadata-mask", "07 06 05 04 03 02 01 00",
164                 ByteBufUtils.bytesToHexString(actual));
165         Assert.assertEquals("Wrong instruction type", 5, out.readUnsignedShort());
166         Assert.assertEquals("Wrong instruction length", 8, out.readUnsignedShort());
167         out.skipBytes(4);
168         Assert.assertEquals("Wrong instruction type", 6, out.readUnsignedShort());
169         Assert.assertEquals("Wrong instruction length", 8, out.readUnsignedShort());
170         Assert.assertEquals("Wrong instruction meter-id", 42, out.readUnsignedInt());
171         Assert.assertEquals("Wrong instruction type", 3, out.readUnsignedShort());
172         Assert.assertEquals("Wrong instruction length", 32, out.readUnsignedShort());
173         out.skipBytes(4);
174         Assert.assertEquals("Wrong action type", 0, out.readUnsignedShort());
175         Assert.assertEquals("Wrong action length", 16, out.readUnsignedShort());
176         Assert.assertEquals("Wrong action type", 45, out.readUnsignedInt());
177         Assert.assertEquals("Wrong action type", 55, out.readUnsignedShort());
178         out.skipBytes(6);
179         Assert.assertEquals("Wrong action type", 23, out.readUnsignedShort());
180         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
181         Assert.assertEquals("Wrong action type", 64, out.readUnsignedByte());
182         out.skipBytes(3);
183         Assert.assertEquals("Wrong instruction type", 4, out.readUnsignedShort());
184         Assert.assertEquals("Wrong instruction length", 24, out.readUnsignedShort());
185         out.skipBytes(4);
186         Assert.assertEquals("Wrong action type", 17, out.readUnsignedShort());
187         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
188         Assert.assertEquals("Wrong action ethertype", 14, out.readUnsignedShort());
189         out.skipBytes(2);
190         Assert.assertEquals("Wrong action type", 27, out.readUnsignedShort());
191         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
192         out.skipBytes(4);
193         Assert.assertTrue("Not all data were read", out.readableBytes() == 0);
194     }
195
196 }