Use ByteBuf.readRetainedSlice()
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / protocol / serialization / messages / GroupMessageSerializerTest.java
1 /*
2  * Copyright (c) 2016 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.openflowplugin.impl.protocol.serialization.messages;
9
10 import static org.junit.Assert.assertArrayEquals;
11 import static org.junit.Assert.assertEquals;
12
13 import io.netty.buffer.ByteBuf;
14 import io.netty.buffer.UnpooledByteBufAllocator;
15 import org.junit.Test;
16 import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
17 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
18 import org.opendaylight.openflowjava.protocol.impl.util.ActionConstants;
19 import org.opendaylight.openflowplugin.impl.protocol.serialization.AbstractSerializerTest;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcActionBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupMessage;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupMessageBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand;
35 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
36 import org.opendaylight.yangtools.yang.common.Uint16;
37 import org.opendaylight.yangtools.yang.common.Uint32;
38 import org.opendaylight.yangtools.yang.common.Uint8;
39
40 public class GroupMessageSerializerTest extends AbstractSerializerTest {
41     private static final byte PADDING_IN_GROUP_MOD_MESSAGE = 1;
42     private static final byte PADDING_IN_BUCKET = 4;
43
44     private static final Uint32 XID = Uint32.valueOf(42);
45     private static final Uint8 VERSION = EncodeConstants.OF_VERSION_1_3;
46     private static final Boolean BARRIER = false;
47     private static final GroupModCommand COMMAND = GroupModCommand.OFPGCADD;
48     private static final String CONTAINER_NAME = "openflow:1";
49     private static final GroupId GROUP_ID = new GroupId(Uint32.valueOf(41));
50     private static final String GROUP_NAME = "group41";
51     private static final GroupTypes GROUP_TYPE = GroupTypes.GroupAll;
52
53     private static final BucketId BUCKET_ID = new BucketId(Uint32.valueOf(40));
54     private static final BucketKey BUCKET_KEY = new BucketKey(BUCKET_ID);
55     private static final Uint32 BUCKET_WATCH_GROUP = Uint32.valueOf(12);
56     private static final Uint32 BUCKET_WATCH_PORT = Uint32.valueOf(6);
57     private static final Uint16 BUCKET_WEIGHT = Uint16.valueOf(50);
58     private static final Integer ACTION_ORDER = 0;
59     private static final ActionKey ACTION_KEY = new ActionKey(ACTION_ORDER);
60     private static final Ipv4Prefix IPV4_PREFIX = new Ipv4Prefix("192.168.76.0/32");
61
62     private static final GroupMessage MESSAGE = new GroupMessageBuilder()
63         .setBarrier(BARRIER)
64         .setBuckets(new BucketsBuilder()
65             .setBucket(BindingMap.of(new BucketBuilder()
66                 .setBucketId(BUCKET_ID)
67                 .withKey(BUCKET_KEY)
68                 .setWatchGroup(BUCKET_WATCH_GROUP)
69                 .setWatchPort(BUCKET_WATCH_PORT)
70                 .setWeight(BUCKET_WEIGHT)
71                 .setAction(BindingMap.of(
72                     new ActionBuilder()
73                     .setAction(new SetNwSrcActionCaseBuilder()
74                         .setSetNwSrcAction(new SetNwSrcActionBuilder()
75                             .setAddress(new Ipv4Builder()
76                                 .setIpv4Address(new Ipv4Prefix(IPV4_PREFIX))
77                                 .build())
78                             .build())
79                         .build())
80                     .setOrder(ACTION_ORDER)
81                     .withKey(ACTION_KEY)
82                     .build()
83                     ))
84                 .build()))
85             .build())
86         .setCommand(COMMAND)
87         .setContainerName(CONTAINER_NAME)
88         .setGroupId(GROUP_ID)
89         .setGroupName(GROUP_NAME)
90         .setGroupType(GROUP_TYPE)
91         .setVersion(VERSION)
92         .setXid(XID)
93         .build();
94
95     private GroupMessageSerializer serializer;
96
97     @Override
98     protected void init() {
99         serializer = getRegistry()
100                 .getSerializer(new MessageTypeKey<>(EncodeConstants.OF_VERSION_1_3, GroupMessage.class));
101     }
102
103     @Test
104     public void testSerialize() {
105         final ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
106         serializer.serialize(MESSAGE, out);
107
108         // Header
109         assertEquals(out.readByte(), VERSION.shortValue());
110         assertEquals(out.readByte(), serializer.getMessageType());
111         out.readShort(); // LENGTH, TODO: assert it
112         assertEquals(out.readInt(), XID.intValue());
113
114         // Body
115         assertEquals(out.readUnsignedShort(), COMMAND.getIntValue());
116         assertEquals(out.readByte(), GROUP_TYPE.getIntValue());
117         out.skipBytes(PADDING_IN_GROUP_MOD_MESSAGE);
118         assertEquals(out.readUnsignedInt(), GROUP_ID.getValue().longValue());
119
120         // Bucket
121         out.readShort(); // Bucket length, TODO: assert it
122         assertEquals(out.readUnsignedShort(), BUCKET_WEIGHT.intValue());
123         assertEquals(out.readUnsignedInt(), BUCKET_WATCH_PORT.longValue());
124         assertEquals(out.readUnsignedInt(), BUCKET_WATCH_GROUP.longValue());
125         out.skipBytes(PADDING_IN_BUCKET);
126
127         // Action
128         assertEquals(out.readUnsignedShort(), ActionConstants.SET_FIELD_CODE);
129         assertEquals(out.readUnsignedShort(), Short.BYTES // Size of action type
130                         + Short.BYTES // Size of action length
131                         + Short.BYTES // Match entry OXM class
132                         + Byte.BYTES // Match entry field and mask
133                         + Byte.BYTES // Match entry length
134                         + EncodeConstants.PADDING); // Size of set field (match entry)
135         // Skip match entry header, we have tests for this elsewhere
136         out.skipBytes(Integer.BYTES);
137
138         // Actual match body
139         byte[] addressBytes = new byte[4];
140         out.readBytes(addressBytes);
141         assertArrayEquals(addressBytes, new byte[] { (byte) 192, (byte) 168, 76, 0 });
142
143         int paddingRemainder = out.readerIndex() % EncodeConstants.PADDING;
144
145         if (paddingRemainder != 0) {
146             out.skipBytes(EncodeConstants.PADDING - paddingRemainder);
147         }
148
149         assertEquals(out.readableBytes(), 0);
150     }
151
152 }