Bump upstreams for 2022.09 Chlorine
[openflowplugin.git] / extension / openflowjava-extension-nicira / src / test / java / org / opendaylight / openflowjava / nx / codec / match / AbstractExperimenterMatchCodecTest.java
1 /*
2  * Copyright (c) 2018 SUSE LINUX GmbH.  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.openflowjava.nx.codec.match;
9
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;
14
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;
34
35 public class AbstractExperimenterMatchCodecTest {
36
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;
42
43     private static class TestNxmField implements MatchField {
44         // test class
45
46         @Override
47         public Class<? extends MatchField> implementedInterface() {
48             return TestNxmField.class;
49         }
50     }
51
52     private static class TestCodec extends AbstractExperimenterMatchCodec {
53
54         @Override
55         protected void serializeValue(final NxExpMatchEntryValue value, final boolean hasMask,
56                 final ByteBuf outBuffer) {
57             // noop
58         }
59
60         @Override
61         protected NxExpMatchEntryValue deserializeValue(final ByteBuf outBuffer, final boolean hasMask) {
62             return null;
63         }
64
65         @Override
66         protected Uint32 getExperimenterId() {
67             return EXPERIMENTER_ID;
68         }
69
70         @Override
71         public int getValueLength() {
72             return VALUE_LENGTH;
73         }
74
75         @Override
76         public int getNxmFieldCode() {
77             return FIELD_CODE;
78         }
79
80         @Override
81         public MatchField getNxmField() {
82             return TestNxmField.VALUE;
83         }
84     }
85
86     @Before
87     public void setup() {
88         buffer = ByteBufAllocator.DEFAULT.buffer();
89         testCodec = spy(new TestCodec());
90     }
91
92     @Test
93     public void testSerializeNoMask() {
94         MatchEntry matchEntry = createMatchEntry(null, false);
95
96         testCodec.serialize(matchEntry, buffer);
97
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);
104     }
105
106     @Test
107     public void testSerializeWithMask() {
108         MatchEntry matchEntry = createMatchEntry(null, true);
109
110         testCodec.serialize(matchEntry, buffer);
111
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);
118     }
119
120     @Test
121     public void testDeserializeNoMask() {
122         writeBuffer(buffer, false);
123
124         MatchEntry matchEntry = testCodec.deserialize(buffer);
125
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);
133     }
134
135     @Test
136     public void testDeserializeWithMask() {
137         writeBuffer(buffer, true);
138
139         MatchEntry matchEntry = testCodec.deserialize(buffer);
140
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);
148     }
149
150     static MatchEntry createMatchEntry(final NxExpMatchEntryValue value, final boolean hasMask) {
151         return new MatchEntryBuilder()
152                 .setOxmClass(ExperimenterClass.VALUE)
153                 .setOxmMatchField(TestNxmField.VALUE)
154                 .setHasMask(hasMask)
155                 .setMatchEntryValue(new ExperimenterIdCaseBuilder()
156                     .setExperimenter(new ExperimenterBuilder()
157                         .setExperimenter(new ExperimenterId(EXPERIMENTER_ID))
158                         .build())
159                     .addAugmentation(new OfjAugNxExpMatchBuilder().setNxExpMatchEntryValue(value).build())
160                     .build())
161                 .build();
162     }
163
164     static void writeBuffer(final ByteBuf message, final boolean hasMask) {
165         int fieldMask = FIELD_CODE << 1;
166         int length = Integer.BYTES + VALUE_LENGTH;
167         if (hasMask) {
168             fieldMask |= 1;
169             length += VALUE_LENGTH;
170         }
171         message.writeShort(OxmMatchConstants.EXPERIMENTER_CLASS);
172         message.writeByte(fieldMask);
173         message.writeByte(length);
174         message.writeInt(EXPERIMENTER_ID.intValue());
175     }
176 }