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