2 * Copyright (c) 2016 Pantheon Technologies s.r.o. and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.impl.protocol.serialization.messages;
11 import static org.junit.Assert.assertArrayEquals;
12 import static org.junit.Assert.assertEquals;
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 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
41 import org.opendaylight.yangtools.yang.common.Uint16;
42 import org.opendaylight.yangtools.yang.common.Uint32;
43 import org.opendaylight.yangtools.yang.common.Uint8;
45 public class GroupMessageSerializerTest extends AbstractSerializerTest {
46 private static final byte PADDING_IN_GROUP_MOD_MESSAGE = 1;
47 private static final byte PADDING_IN_BUCKET = 4;
49 private static final Uint32 XID = Uint32.valueOf(42);
50 private static final Uint8 VERSION = EncodeConstants.OF_VERSION_1_3;
51 private static final Boolean BARRIER = false;
52 private static final GroupModCommand COMMAND = GroupModCommand.OFPGCADD;
53 private static final String CONTAINER_NAME = "openflow:1";
54 private static final GroupId GROUP_ID = new GroupId(Uint32.valueOf(41));
55 private static final String GROUP_NAME = "group41";
56 private static final GroupTypes GROUP_TYPE = GroupTypes.GroupAll;
58 private static final BucketId BUCKET_ID = new BucketId(Uint32.valueOf(40));
59 private static final BucketKey BUCKET_KEY = new BucketKey(BUCKET_ID);
60 private static final Uint32 BUCKET_WATCH_GROUP = Uint32.valueOf(12);
61 private static final Uint32 BUCKET_WATCH_PORT = Uint32.valueOf(6);
62 private static final Uint16 BUCKET_WEIGHT = Uint16.valueOf(50);
63 private static final Integer ACTION_ORDER = 0;
64 private static final ActionKey ACTION_KEY = new ActionKey(ACTION_ORDER);
65 private static final Ipv4Prefix IPV4_PREFIX = new Ipv4Prefix("192.168.76.0/32");
67 private static final List<Action> ACTIONS = Collections.singletonList(
69 .setAction(new SetNwSrcActionCaseBuilder()
70 .setSetNwSrcAction(new SetNwSrcActionBuilder()
71 .setAddress(new Ipv4Builder()
72 .setIpv4Address(new Ipv4Prefix(IPV4_PREFIX))
76 .setOrder(ACTION_ORDER)
81 private static final Buckets BUCKETS = new BucketsBuilder()
82 .setBucket(BindingMap.of(new BucketBuilder()
83 .setBucketId(BUCKET_ID)
85 .setWatchGroup(BUCKET_WATCH_GROUP)
86 .setWatchPort(BUCKET_WATCH_PORT)
87 .setWeight(BUCKET_WEIGHT)
92 private static final GroupMessage MESSAGE = new GroupMessageBuilder()
96 .setContainerName(CONTAINER_NAME)
98 .setGroupName(GROUP_NAME)
99 .setGroupType(GROUP_TYPE)
104 private GroupMessageSerializer serializer;
107 protected void init() {
108 serializer = getRegistry()
109 .getSerializer(new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, GroupMessage.class));
113 public void testSerialize() {
114 final ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
115 serializer.serialize(MESSAGE, out);
118 assertEquals(out.readByte(), VERSION.shortValue());
119 assertEquals(out.readByte(), serializer.getMessageType());
120 out.readShort(); // LENGTH, TODO: assert it
121 assertEquals(out.readInt(), XID.intValue());
124 assertEquals(out.readUnsignedShort(), COMMAND.getIntValue());
125 assertEquals(out.readByte(), GROUP_TYPE.getIntValue());
126 out.skipBytes(PADDING_IN_GROUP_MOD_MESSAGE);
127 assertEquals(out.readUnsignedInt(), GROUP_ID.getValue().longValue());
130 out.readShort(); // Bucket length, TODO: assert it
131 assertEquals(out.readUnsignedShort(), BUCKET_WEIGHT.intValue());
132 assertEquals(out.readUnsignedInt(), BUCKET_WATCH_PORT.longValue());
133 assertEquals(out.readUnsignedInt(), BUCKET_WATCH_GROUP.longValue());
134 out.skipBytes(PADDING_IN_BUCKET);
137 assertEquals(out.readUnsignedShort(), ActionConstants.SET_FIELD_CODE);
138 assertEquals(out.readUnsignedShort(), Short.BYTES // Size of action type
139 + Short.BYTES // Size of action length
140 + Short.BYTES // Match entry OXM class
141 + Byte.BYTES // Match entry field and mask
142 + Byte.BYTES // Match entry length
143 + EncodeConstants.PADDING); // Size of set field (match entry)
144 // Skip match entry header, we have tests for this elsewhere
145 out.skipBytes(Integer.BYTES);
148 byte[] addressBytes = new byte[4];
149 out.readBytes(addressBytes);
150 assertArrayEquals(addressBytes, new byte[] { (byte) 192, (byte) 168, 76, 0 });
152 int paddingRemainder = out.readerIndex() % EncodeConstants.PADDING;
154 if (paddingRemainder != 0) {
155 out.skipBytes(EncodeConstants.PADDING - paddingRemainder);
158 assertEquals(out.readableBytes(), 0);