/*
* Copyright (c) 2016 Pantheon Technologies s.r.o. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.openflowplugin.impl.protocol.serialization.match;
import static org.junit.Assert.assertEquals;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.UnpooledByteBufAllocator;
import java.util.function.Consumer;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
public abstract class AbstractExperimenterMatchEntrySerializerTest extends AbstractMatchEntrySerializerTest {
protected void assertMatch(final Match match, final boolean hasMask, final Consumer<ByteBuf> assertBody) throws Exception {
final ByteBuf buffer = UnpooledByteBufAllocator.DEFAULT.buffer();
getSerializer().serialize(match, buffer);
final int length = (hasMask ? 2 : 1) * getLength();
final int lengthExp = length + EncodeConstants.SIZE_OF_INT_IN_BYTES; // add length of Experimenter ID
assertEquals(buffer.readShort(), 1); // OXM_MATCH_TYPE
assertEquals(buffer.readShort(), // Total length of match
EncodeConstants.SIZE_OF_SHORT_IN_BYTES // OXM_MATCH_TYPE length
+ EncodeConstants.SIZE_OF_SHORT_IN_BYTES // LENGTH length
+ EncodeConstants.SIZE_OF_SHORT_IN_BYTES // OXM_CLASS_CODE length
+ EncodeConstants.SIZE_OF_BYTE_IN_BYTES // OXM field and mask length
+ EncodeConstants.SIZE_OF_BYTE_IN_BYTES // OXM field and mask length length
+ lengthExp // length of data in match entry
);
assertEquals(buffer.readUnsignedShort(), getOxmClassCode());
final short fieldAndMask = buffer.readUnsignedByte();
assertEquals(getOxmFieldCode(), fieldAndMask >>> 1);
assertEquals(hasMask, (fieldAndMask & 1) != 0);
assertEquals(buffer.readUnsignedByte(), lengthExp);
assertEquals(buffer.readUnsignedInt(), getExperimenterId());
assertBody.accept(buffer);
int paddingRemainder = lengthExp % EncodeConstants.PADDING;
if (paddingRemainder != 0) {
buffer.skipBytes(EncodeConstants.PADDING - paddingRemainder);
}
assertEquals(buffer.readableBytes(), 0);
}
protected abstract long getExperimenterId();
}