changes for config subsystem - BUG 754
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / util / InstructionsSerializerTest.java
1 /*\r
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.openflowjava.protocol.impl.util;\r
9 \r
10 import io.netty.buffer.ByteBuf;\r
11 import io.netty.buffer.UnpooledByteBufAllocator;\r
12 \r
13 import java.util.ArrayList;\r
14 import java.util.List;\r
15 \r
16 import org.junit.Assert;\r
17 import org.junit.Test;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstruction;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstructionBuilder;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataInstruction;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataInstructionBuilder;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MeterIdInstruction;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MeterIdInstructionBuilder;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TableIdInstruction;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TableIdInstructionBuilder;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.ApplyActions;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.ClearActions;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.GotoTable;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.Meter;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.WriteActions;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.WriteMetadata;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.InstructionBuilder;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
50 \r
51 /**\r
52  * @author michal.polkorab\r
53  *\r
54  */\r
55 public class InstructionsSerializerTest {\r
56 \r
57     /**\r
58      * Testing instructions translation\r
59      */\r
60     @Test\r
61     public void test() {\r
62         List<Instruction> instructions = new ArrayList<>();\r
63         // Goto_table instruction\r
64         InstructionBuilder builder = new InstructionBuilder();\r
65         builder.setType(GotoTable.class);\r
66         TableIdInstructionBuilder tableIdBuilder = new TableIdInstructionBuilder();\r
67         tableIdBuilder.setTableId((short) 5);\r
68         builder.addAugmentation(TableIdInstruction.class, tableIdBuilder.build());\r
69         instructions.add(builder.build());\r
70         builder = new InstructionBuilder();\r
71         // Write_metadata instruction\r
72         builder.setType(WriteMetadata.class);\r
73         MetadataInstructionBuilder metaBuilder = new MetadataInstructionBuilder();\r
74         metaBuilder.setMetadata(ByteBufUtils.hexStringToBytes("00 01 02 03 04 05 06 07"));\r
75         metaBuilder.setMetadataMask(ByteBufUtils.hexStringToBytes("07 06 05 04 03 02 01 00"));\r
76         builder.addAugmentation(MetadataInstruction.class, metaBuilder.build());\r
77         instructions.add(builder.build());\r
78         // Clear_actions instruction\r
79         builder = new InstructionBuilder();\r
80         builder.setType(ClearActions.class);\r
81         instructions.add(builder.build());\r
82         // Meter instruction\r
83         builder = new InstructionBuilder();\r
84         builder.setType(Meter.class);\r
85         MeterIdInstructionBuilder meterBuilder = new MeterIdInstructionBuilder();\r
86         meterBuilder.setMeterId(42L);\r
87         builder.addAugmentation(MeterIdInstruction.class, meterBuilder.build());\r
88         instructions.add(builder.build());\r
89         // Write_actions instruction\r
90         builder = new InstructionBuilder();\r
91         builder.setType(WriteActions.class);\r
92         ActionsInstructionBuilder actionsBuilder = new ActionsInstructionBuilder();\r
93         List<Action> actions = new ArrayList<>();\r
94         ActionBuilder actionBuilder = new ActionBuilder();\r
95         actionBuilder.setType(Output.class);\r
96         PortActionBuilder portBuilder = new PortActionBuilder();\r
97         portBuilder.setPort(new PortNumber(45L));\r
98         actionBuilder.addAugmentation(PortAction.class, portBuilder.build());\r
99         MaxLengthActionBuilder maxBuilder = new MaxLengthActionBuilder();\r
100         maxBuilder.setMaxLength(55);\r
101         actionBuilder.addAugmentation(MaxLengthAction.class, maxBuilder.build());\r
102         actions.add(actionBuilder.build());\r
103         actionBuilder = new ActionBuilder();\r
104         actionBuilder.setType(SetNwTtl.class);\r
105         NwTtlActionBuilder nwTtl = new NwTtlActionBuilder();\r
106         nwTtl.setNwTtl((short) 64);\r
107         actionBuilder.addAugmentation(NwTtlAction.class, nwTtl.build());\r
108         actions.add(actionBuilder.build());\r
109         actionsBuilder.setAction(actions);\r
110         builder.addAugmentation(ActionsInstruction.class, actionsBuilder.build());\r
111         instructions.add(builder.build());\r
112         // Apply_actions instruction\r
113         builder = new InstructionBuilder();\r
114         builder.setType(ApplyActions.class);\r
115         actionsBuilder = new ActionsInstructionBuilder();\r
116         actions = new ArrayList<>();\r
117         actionBuilder = new ActionBuilder();\r
118         actionBuilder.setType(PushVlan.class);\r
119         EthertypeActionBuilder ethertypeBuilder = new EthertypeActionBuilder();\r
120         ethertypeBuilder.setEthertype(new EtherType(14));\r
121         actionBuilder.addAugmentation(EthertypeAction.class, ethertypeBuilder.build());\r
122         actions.add(actionBuilder.build());\r
123         actionBuilder = new ActionBuilder();\r
124         actionBuilder.setType(PopPbb.class);\r
125         actions.add(actionBuilder.build());\r
126         actionsBuilder.setAction(actions);\r
127         builder.addAugmentation(ActionsInstruction.class, actionsBuilder.build());\r
128         instructions.add(builder.build());\r
129         \r
130         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
131         InstructionsSerializer.encodeInstructions(instructions, out);\r
132         \r
133         Assert.assertEquals("Wrong instruction type", 1, out.readUnsignedShort());\r
134         Assert.assertEquals("Wrong instruction length", 8, out.readUnsignedShort());\r
135         Assert.assertEquals("Wrong instruction table-id", 5, out.readUnsignedByte());\r
136         out.skipBytes(3);\r
137         Assert.assertEquals("Wrong instruction type", 2, out.readUnsignedShort());\r
138         Assert.assertEquals("Wrong instruction length", 24, out.readUnsignedShort());\r
139         out.skipBytes(4);\r
140         byte[] actual = new byte[8];\r
141         out.readBytes(actual);\r
142         Assert.assertEquals("Wrong instruction metadata", "00 01 02 03 04 05 06 07",\r
143                 ByteBufUtils.bytesToHexString(actual));\r
144         actual = new byte[8];\r
145         out.readBytes(actual);\r
146         Assert.assertEquals("Wrong instruction metadata-mask", "07 06 05 04 03 02 01 00",\r
147                 ByteBufUtils.bytesToHexString(actual));\r
148         Assert.assertEquals("Wrong instruction type", 5, out.readUnsignedShort());\r
149         Assert.assertEquals("Wrong instruction length", 8, out.readUnsignedShort());\r
150         out.skipBytes(4);\r
151         Assert.assertEquals("Wrong instruction type", 6, out.readUnsignedShort());\r
152         Assert.assertEquals("Wrong instruction length", 8, out.readUnsignedShort());\r
153         Assert.assertEquals("Wrong instruction meter-id", 42, out.readUnsignedInt());\r
154         Assert.assertEquals("Wrong instruction type", 3, out.readUnsignedShort());\r
155         Assert.assertEquals("Wrong instruction length", 32, out.readUnsignedShort());\r
156         out.skipBytes(4);\r
157         Assert.assertEquals("Wrong action type", 0, out.readUnsignedShort());\r
158         Assert.assertEquals("Wrong action length", 16, out.readUnsignedShort());\r
159         Assert.assertEquals("Wrong action type", 45, out.readUnsignedInt());\r
160         Assert.assertEquals("Wrong action type", 55, out.readUnsignedShort());\r
161         out.skipBytes(6);\r
162         Assert.assertEquals("Wrong action type", 23, out.readUnsignedShort());\r
163         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
164         Assert.assertEquals("Wrong action type", 64, out.readUnsignedByte());\r
165         out.skipBytes(3);\r
166         Assert.assertEquals("Wrong instruction type", 4, out.readUnsignedShort());\r
167         Assert.assertEquals("Wrong instruction length", 24, out.readUnsignedShort());\r
168         out.skipBytes(4);\r
169         Assert.assertEquals("Wrong action type", 17, out.readUnsignedShort());\r
170         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
171         Assert.assertEquals("Wrong action ethertype", 14, out.readUnsignedShort());\r
172         out.skipBytes(2);\r
173         Assert.assertEquals("Wrong action type", 27, out.readUnsignedShort());\r
174         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
175         out.skipBytes(4);\r
176         Assert.assertTrue("Not all data were read", out.readableBytes() == 0);\r
177     }\r
178 \r
179 }\r