OPNFLWPLUG-1032: Neon-MRI: Bump odlparent, yangtools, mdsal
[openflowplugin.git] / extension / openflowjava-extension-nicira / src / test / java / org / opendaylight / openflowjava / nx / codec / action / RegLoad2CodecTest.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
9 package org.opendaylight.openflowjava.nx.codec.action;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertSame;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.doNothing;
15 import static org.mockito.Mockito.when;
16
17 import io.netty.buffer.ByteBuf;
18 import io.netty.buffer.UnpooledByteBufAllocator;
19 import java.util.Collections;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.junit.runner.RunWith;
23 import org.mockito.Mock;
24 import org.mockito.runners.MockitoJUnitRunner;
25 import org.opendaylight.openflowjava.nx.api.NiciraConstants;
26 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
27 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
28 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
29 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
30 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
31 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
32 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
33 import org.opendaylight.openflowjava.util.ByteBufUtils;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.experimenter.id._case.ExperimenterBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionRegLoad2;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionRegLoad2Builder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.reg.load2.grouping.NxActionRegLoad2;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.reg.load2.grouping.NxActionRegLoad2Builder;
47
48 @RunWith(MockitoJUnitRunner.class)
49 public class RegLoad2CodecTest {
50
51     private RegLoad2Codec regLoad2Codec;
52
53     @Mock
54     private SerializerRegistry serializerRegistry;
55     @Mock
56     private DeserializerRegistry deserializerRegistry;
57     @Mock
58     private OFSerializer<MatchEntry> ofSerializer;
59     @Mock
60     private OFDeserializer<MatchEntry> ofDeserializer;
61
62     @Before
63     public void setup() {
64         regLoad2Codec = new RegLoad2Codec();
65         regLoad2Codec.injectSerializerRegistry(serializerRegistry);
66         regLoad2Codec.injectDeserializerRegistry(deserializerRegistry);
67     }
68
69     @Test
70     public void deserialize() {
71         final ByteBuf byteBuf = ByteBufUtils.hexStringToByteBuf(
72                 "FF FF 00 14 00 00 23 20 00 21"             // REG_LOAD2 header
73                 + " FF FF 02 00 00 5A D6 50"                       // OXM field
74                 + " 00 00 00 00 00 00");                           // padding
75         MatchEntryDeserializerKey key = new MatchEntryDeserializerKey(
76                 EncodeConstants.OF13_VERSION_ID,
77                 EncodeConstants.EXPERIMENTER_VALUE,
78                 1);
79         key.setExperimenterId(NiciraConstants.NX_NSH_VENDOR_ID);
80         final MatchEntry matchEntry = new MatchEntryBuilder().build();
81         when(deserializerRegistry.getDeserializer(key)).thenReturn(ofDeserializer);
82         when(ofDeserializer.deserialize(byteBuf)).thenAnswer(invocationOnMock -> {
83             invocationOnMock.<ByteBuf>getArgument(0).skipBytes(8);
84             return matchEntry;
85         });
86
87         Action action = regLoad2Codec.deserialize(byteBuf);
88
89         assertEquals(0, byteBuf.readableBytes());
90         assertSame(((ActionRegLoad2) action.getActionChoice()).getNxActionRegLoad2().getMatchEntry().get(0),
91                 matchEntry);
92     }
93
94     @Test
95     public void serialize() {
96         final ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
97         final Action action = createAction();
98         MatchEntrySerializerKey<?, ?> key = new MatchEntrySerializerKey<>(
99                 EncodeConstants.OF13_VERSION_ID,
100                 ExperimenterClass.class,
101                 OxmMatchFieldClass.class);
102         key.setExperimenterId(NiciraConstants.NX_NSH_VENDOR_ID);
103         when(serializerRegistry.getSerializer(key)).thenReturn(ofSerializer);
104         doNothing().when(ofSerializer).serialize(any(), any());
105
106         regLoad2Codec.serialize(action, out);
107
108         assertEquals(EncodeConstants.EXPERIMENTER_VALUE, out.readUnsignedShort());
109         assertEquals(16, out.readUnsignedShort());
110         assertEquals(NiciraConstants.NX_VENDOR_ID.longValue(), out.readUnsignedInt());
111         assertEquals(RegLoad2Codec.SUBTYPE, out.readUnsignedShort());
112     }
113
114     private Action createAction() {
115         ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder();
116         experimenterBuilder.setExperimenter(new ExperimenterId(NiciraConstants.NX_NSH_VENDOR_ID));
117         ExperimenterIdCaseBuilder expCaseBuilder = new ExperimenterIdCaseBuilder();
118         expCaseBuilder.setExperimenter(experimenterBuilder.build());
119         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
120         matchEntryBuilder.setOxmMatchField(OxmMatchFieldClass.class);
121         matchEntryBuilder.setOxmClass(ExperimenterClass.class);
122         matchEntryBuilder.setMatchEntryValue(expCaseBuilder.build());
123         NxActionRegLoad2 nxActionRegLoad2 = new NxActionRegLoad2Builder()
124                 .setMatchEntry(Collections.singletonList(matchEntryBuilder.build()))
125                 .build();
126         ActionRegLoad2 actionRegLoad2 = new ActionRegLoad2Builder().setNxActionRegLoad2(nxActionRegLoad2).build();
127         return new ActionBuilder().setActionChoice(actionRegLoad2).build();
128     }
129
130     private interface OxmMatchFieldClass extends MatchField {
131         // only for testing purposes
132     }
133 }