2 * Copyright (c) 2018 SUSE LINUX GmbH. 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
8 package org.opendaylight.openflowjava.nx.codec.match;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.mockito.Mockito.spy;
13 import static org.mockito.Mockito.verify;
15 import io.netty.buffer.ByteBuf;
16 import io.netty.buffer.ByteBufAllocator;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.opendaylight.openflowjava.nx.api.NiciraConstants;
20 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
21 import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.experimenter.id.match.entry.ExperimenterIdCase;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.experimenter.id.match.entry.ExperimenterIdCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.experimenter.id.match.entry.experimenter.id._case.Experimenter;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.experimenter.id.match.entry.experimenter.id._case.ExperimenterBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxExpMatchBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.aug.nx.exp.match.NxExpMatchEntryValue;
33 import org.opendaylight.yangtools.yang.common.Uint32;
35 public class AbstractExperimenterMatchCodecTest {
37 private static final int VALUE_LENGTH = 4;
38 private static final int FIELD_CODE = 16;
39 private static final Uint32 EXPERIMENTER_ID = NiciraConstants.NX_NSH_VENDOR_ID;
40 private ByteBuf buffer;
41 private TestCodec testCodec;
43 private static class TestNxmField implements MatchField {
47 public Class<? extends MatchField> implementedInterface() {
48 return TestNxmField.class;
52 private static class TestCodec extends AbstractExperimenterMatchCodec {
55 protected void serializeValue(final NxExpMatchEntryValue value, final boolean hasMask,
56 final ByteBuf outBuffer) {
61 protected NxExpMatchEntryValue deserializeValue(final ByteBuf outBuffer, final boolean hasMask) {
66 protected Uint32 getExperimenterId() {
67 return EXPERIMENTER_ID;
71 public int getValueLength() {
76 public int getNxmFieldCode() {
81 public MatchField getNxmField() {
82 return TestNxmField.VALUE;
88 buffer = ByteBufAllocator.DEFAULT.buffer();
89 testCodec = spy(new TestCodec());
93 public void testSerializeNoMask() {
94 MatchEntry matchEntry = createMatchEntry(null, false);
96 testCodec.serialize(matchEntry, buffer);
98 assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
99 assertEquals(FIELD_CODE << 1, buffer.readUnsignedByte());
100 assertEquals(Integer.BYTES + VALUE_LENGTH, buffer.readUnsignedByte());
101 assertEquals(EXPERIMENTER_ID.longValue(), buffer.readUnsignedInt());
102 assertFalse(buffer.isReadable());
103 verify(testCodec).serializeValue(null, false, buffer);
107 public void testSerializeWithMask() {
108 MatchEntry matchEntry = createMatchEntry(null, true);
110 testCodec.serialize(matchEntry, buffer);
112 assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
113 assertEquals(FIELD_CODE << 1 | 1, buffer.readUnsignedByte());
114 assertEquals(Integer.BYTES + VALUE_LENGTH * 2, buffer.readUnsignedByte());
115 assertEquals(EXPERIMENTER_ID.longValue(), buffer.readUnsignedInt());
116 assertFalse(buffer.isReadable());
117 verify(testCodec).serializeValue(null, true, buffer);
121 public void testDeserializeNoMask() {
122 writeBuffer(buffer, false);
124 MatchEntry matchEntry = testCodec.deserialize(buffer);
126 assertEquals(ExperimenterClass.VALUE, matchEntry.getOxmClass());
127 assertEquals(TestNxmField.VALUE, matchEntry.getOxmMatchField());
128 assertEquals(false, matchEntry.getHasMask());
129 Experimenter experimenter = ((ExperimenterIdCase) matchEntry.getMatchEntryValue()).getExperimenter();
130 assertEquals(EXPERIMENTER_ID, experimenter.getExperimenter().getValue());
131 assertFalse(buffer.isReadable());
132 verify(testCodec).deserializeValue(buffer, false);
136 public void testDeserializeWithMask() {
137 writeBuffer(buffer, true);
139 MatchEntry matchEntry = testCodec.deserialize(buffer);
141 assertEquals(ExperimenterClass.VALUE, matchEntry.getOxmClass());
142 assertEquals(TestNxmField.VALUE, matchEntry.getOxmMatchField());
143 assertEquals(true, matchEntry.getHasMask());
144 Experimenter experimenter = ((ExperimenterIdCase) matchEntry.getMatchEntryValue()).getExperimenter();
145 assertEquals(EXPERIMENTER_ID, experimenter.getExperimenter().getValue());
146 assertFalse(buffer.isReadable());
147 verify(testCodec).deserializeValue(buffer, true);
150 static MatchEntry createMatchEntry(final NxExpMatchEntryValue value, final boolean hasMask) {
151 return new MatchEntryBuilder()
152 .setOxmClass(ExperimenterClass.VALUE)
153 .setOxmMatchField(TestNxmField.VALUE)
155 .setMatchEntryValue(new ExperimenterIdCaseBuilder()
156 .setExperimenter(new ExperimenterBuilder()
157 .setExperimenter(new ExperimenterId(EXPERIMENTER_ID))
159 .addAugmentation(new OfjAugNxExpMatchBuilder().setNxExpMatchEntryValue(value).build())
164 static void writeBuffer(final ByteBuf message, final boolean hasMask) {
165 int fieldMask = FIELD_CODE << 1;
166 int length = Integer.BYTES + VALUE_LENGTH;
169 length += VALUE_LENGTH;
171 message.writeShort(OxmMatchConstants.EXPERIMENTER_CLASS);
172 message.writeByte(fieldMask);
173 message.writeByte(length);
174 message.writeInt(EXPERIMENTER_ID.intValue());