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
9 package org.opendaylight.openflowjava.nx.codec.action;
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;
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;
48 @RunWith(MockitoJUnitRunner.class)
49 public class RegLoad2CodecTest {
51 private RegLoad2Codec regLoad2Codec;
54 private SerializerRegistry serializerRegistry;
56 private DeserializerRegistry deserializerRegistry;
58 private OFSerializer<MatchEntry> ofSerializer;
60 private OFDeserializer<MatchEntry> ofDeserializer;
64 regLoad2Codec = new RegLoad2Codec();
65 regLoad2Codec.injectSerializerRegistry(serializerRegistry);
66 regLoad2Codec.injectDeserializerRegistry(deserializerRegistry);
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,
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);
87 Action action = regLoad2Codec.deserialize(byteBuf);
89 assertEquals(0, byteBuf.readableBytes());
90 assertSame(((ActionRegLoad2) action.getActionChoice()).getNxActionRegLoad2().getMatchEntry().get(0),
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());
106 regLoad2Codec.serialize(action, out);
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());
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()))
126 ActionRegLoad2 actionRegLoad2 = new ActionRegLoad2Builder().setNxActionRegLoad2(nxActionRegLoad2).build();
127 return new ActionBuilder().setActionChoice(actionRegLoad2).build();
130 private interface OxmMatchFieldClass extends MatchField {
131 // only for testing purposes