Promote MessageRegistry to pcep-api
[bgpcep.git] / pcep / impl / src / test / java / org / opendaylight / protocol / pcep / impl / PCEPTlvParserTest.java
index 021b8891f83ccae385949a1514ddfa6bd2df9e86..04664e1d29144aa662b21d58b6cd820dcd70ffbb 100644 (file)
  */
 package org.opendaylight.protocol.pcep.impl;
 
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import com.google.common.collect.ImmutableSet;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.junit.Test;
+import org.opendaylight.protocol.pcep.PCEPDeserializerException;
+import org.opendaylight.protocol.pcep.impl.TestVendorInformationTlvParser.TestEnterpriseSpecificInformation;
+import org.opendaylight.protocol.pcep.parser.tlv.NoPathVectorTlvParser;
+import org.opendaylight.protocol.pcep.parser.tlv.OFListTlvParser;
+import org.opendaylight.protocol.pcep.parser.tlv.OrderTlvParser;
+import org.opendaylight.protocol.pcep.parser.tlv.OverloadedDurationTlvParser;
+import org.opendaylight.protocol.pcep.parser.tlv.PathSetupTypeTlvParser;
+import org.opendaylight.protocol.pcep.parser.tlv.ReqMissingTlvParser;
+import org.opendaylight.protocol.util.ByteArray;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.NoPathVectorTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.OfId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.RequestId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.of.list.tlv.OfList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.of.list.tlv.OfListBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.order.tlv.Order;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.order.tlv.OrderBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.overload.duration.tlv.OverloadDuration;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.overload.duration.tlv.OverloadDurationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.path.setup.type.tlv.PathSetupType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.path.setup.type.tlv.PathSetupTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcrep.message.pcrep.message.replies.result.failure._case.no.path.tlvs.NoPathVectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.req.missing.tlv.ReqMissing;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.req.missing.tlv.ReqMissingBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.vendor.information.tlvs.VendorInformationTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.vendor.information.tlvs.VendorInformationTlvBuilder;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint8;
 
-/**
- * Tests of PCEPTlvParser
- */
 public class PCEPTlvParserTest {
+    private static final byte[] NO_PATH_VECTOR_BYTES = {
+        0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, (byte) 0xa7
+    };
+    private static final byte[] OVERLOADED_BYTES = {
+        0x00, 0x02, 0x00, 0x04, 0x7f, (byte) 0xff, (byte) 0xff, (byte) 0xff
+    };
+    private static final byte[] REQ_MISSING_BYTES = {
+        0x00, 0x03, 0x00, 0x04, (byte) 0xF7, (byte) 0x82, 0x35, 0x17
+    };
+    private static final byte[] ORDER_BYTES = {
+        0x00, 0x05, 0x00, 0x08, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 0x00, 0x00, 0x00, 0x01
+    };
+    private static final byte[] OF_LIST_BYTES = { 0x00, 0x04, 0x00, 0x04, 0x12, 0x34, 0x56, 0x78 };
+    private static final byte[] VENDOR_INFO_BYTES = {
+        0x00, 0x07, 0x00, 0x08,
+        /* Enterprise number */
+        0x00, 0x00, 0x00, 0x00,
+        /* Enterprise specific information */
+        0x00, 0x00, 0x00, 0x05
+    };
+
+    private static final byte[] PST_TLV_BYTES = { 0x0, 0x1C, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0 };
+
+    private static final byte[] PST_TLV_BYTES_UNSUPPORTED = { 0x0, 0x1C, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1 };
+
+    @Test
+    public void testNoPathVectorTlv() throws PCEPDeserializerException {
+        final NoPathVectorTlvParser parser = new NoPathVectorTlvParser();
+        final NoPathVectorTlv tlv = new NoPathVectorBuilder()
+                .setFlags(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
+                    .NoPathVectorTlv.Flags(false, true, false, true, false, true, true, true))
+                .build();
+        assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(NO_PATH_VECTOR_BYTES, 4))));
+        final ByteBuf buff = Unpooled.buffer();
+        parser.serializeTlv(tlv, buff);
+        assertArrayEquals(NO_PATH_VECTOR_BYTES, ByteArray.getAllBytes(buff));
+        assertNull(parser.parseTlv(null));
+    }
+
+    @Test
+    public void testOverloadedDurationTlv() throws PCEPDeserializerException {
+        final OverloadedDurationTlvParser parser = new OverloadedDurationTlvParser();
+        final OverloadDuration tlv = new OverloadDurationBuilder().setDuration(Uint32.valueOf(0x7FFFFFFFL)).build();
+        assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(OVERLOADED_BYTES, 4))));
+        final ByteBuf buff = Unpooled.buffer();
+        parser.serializeTlv(tlv, buff);
+        assertArrayEquals(OVERLOADED_BYTES, ByteArray.getAllBytes(buff));
+        assertNull(parser.parseTlv(null));
+    }
+
+    @Test
+    public void testReqMissingTlv() throws PCEPDeserializerException {
+        final ReqMissingTlvParser parser = new ReqMissingTlvParser();
+        final ReqMissing tlv = new ReqMissingBuilder().setRequestId(new RequestId(Uint32.valueOf(0xF7823517L))).build();
+        assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(REQ_MISSING_BYTES, 4))));
+        final ByteBuf buff = Unpooled.buffer();
+        parser.serializeTlv(tlv, buff);
+        assertArrayEquals(REQ_MISSING_BYTES, ByteArray.getAllBytes(buff));
+        assertNull(parser.parseTlv(null));
+    }
+
+    @Test
+    public void testOrderTlv() throws PCEPDeserializerException {
+        final OrderTlvParser parser = new OrderTlvParser();
+        final Order tlv = new OrderBuilder()
+                .setDelete(Uint32.valueOf(0xFFFFFFFFL))
+                .setSetup(Uint32.valueOf(0x00000001L))
+                .build();
+        assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(ORDER_BYTES, 4))));
+        final ByteBuf buff = Unpooled.buffer();
+        parser.serializeTlv(tlv, buff);
+        assertArrayEquals(ORDER_BYTES, ByteArray.getAllBytes(buff));
+        assertNull(parser.parseTlv(null));
+    }
+
+    @Test
+    public void testOFListTlv() throws PCEPDeserializerException {
+        final OFListTlvParser parser = new OFListTlvParser();
+        final OfList tlv = new OfListBuilder()
+            // Predictable order
+            .setCodes(ImmutableSet.of(new OfId(Uint16.valueOf(0x1234)), new OfId(Uint16.valueOf(0x5678))))
+            .build();
+        assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(OF_LIST_BYTES, 4))));
+        final ByteBuf buff = Unpooled.buffer();
+        parser.serializeTlv(tlv, buff);
+        assertArrayEquals(OF_LIST_BYTES, ByteArray.getAllBytes(buff));
+        assertNull(parser.parseTlv(null));
+    }
+
+    @Test
+    public void testVendorInformationTlv() throws PCEPDeserializerException {
+        final TestVendorInformationTlvParser parser = new TestVendorInformationTlvParser();
+        final TestEnterpriseSpecificInformation esInfo = new TestEnterpriseSpecificInformation(5);
+        final VendorInformationTlv viTlv = new VendorInformationTlvBuilder()
+                .setEnterpriseNumber(new EnterpriseNumber(Uint32.ZERO))
+                .setEnterpriseSpecificInformation(esInfo)
+                .build();
+
+        final VendorInformationTlv parsedTlv = parser.parseTlv(
+            Unpooled.wrappedBuffer(ByteArray.cutBytes(VENDOR_INFO_BYTES, 8)));
+        assertEquals(viTlv, parsedTlv);
+
+        final ByteBuf buff = Unpooled.buffer(VENDOR_INFO_BYTES.length);
+        parser.serializeTlv(viTlv, buff);
+        assertArrayEquals(VENDOR_INFO_BYTES, ByteArray.getAllBytes(buff));
+        assertNull(parser.parseTlv(null));
+    }
+
+    @Test
+    public void testPathSetupTypeTlvParser() throws PCEPDeserializerException {
+        final PathSetupTypeTlvParser parser = new PathSetupTypeTlvParser();
+        final PathSetupType pstTlv = new PathSetupTypeBuilder().setPst(Uint8.ZERO).build();
+        assertEquals(pstTlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(PST_TLV_BYTES, 4))));
+        final ByteBuf buff = Unpooled.buffer();
+        parser.serializeTlv(pstTlv, buff);
+        assertArrayEquals(PST_TLV_BYTES, ByteArray.getAllBytes(buff));
+    }
+
+    @Test(expected = PCEPDeserializerException.class)
+    public void testUnsupportedPSTParser() throws PCEPDeserializerException {
+        final PathSetupTypeTlvParser parser = new PathSetupTypeTlvParser();
+        parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(PST_TLV_BYTES_UNSUPPORTED, 4)));
+    }
 
-       // @Test
-       // public void testDeserialization() throws PCEPDeserializerException, IOException {
-       // final byte[] bytesFromFile = ByteArray.fileToBytes("src/test/resources/PackOfTlvs.bin");
-       // final List<PCEPTlv> tlvsToTest = PCEPTlvParser.parseTlv(bytesFromFile);
-       //
-       // assertEquals(17, tlvsToTest.size());
-       // assertEquals(tlvsToTest.get(0), new PCEStatefulCapabilityTlv(false, false, true));
-       // assertEquals(tlvsToTest.get(1), new LSPStateDBVersionTlv(0xFF00FFAAB2F5F2CFL));
-       // assertEquals(tlvsToTest.get(2), new PCEStatefulCapabilityTlv(false, true, true));
-       // assertEquals(tlvsToTest.get(3), new LSPStateDBVersionTlv(0xFFFFFFFFFFFFFFFFL));
-       // assertEquals(tlvsToTest.get(4), new NoPathVectorTlv(true, true, true, false, true, true));
-       // assertEquals(tlvsToTest.get(5), new OverloadedDurationTlv(0x7FFFFFFF));
-       // assertEquals(tlvsToTest.get(6), new LSPSymbolicNameTlv(new LSPSymbolicName(new
-       // String("Med test of symbolic name").getBytes())));
-       // final byte[] errorCode = { (byte) 0x25, (byte) 0x68, (byte) 0x95, (byte) 0x03 };
-       // assertEquals(tlvsToTest.get(7), new LSPUpdateErrorTlv(errorCode));
-       // final byte[] ipv4Address = { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 };
-       // final byte[] tunnelId1 = { (byte) 0x12, (byte) 0x34 };
-       // final byte[] extendedTunnelID1 = { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 };
-       // final byte[] lspId1 = { (byte) 0xFF, (byte) 0xFF };
-       // assertEquals(tlvsToTest.get(8), new IPv4LSPIdentifiersTlv(new IPv4Address(ipv4Address),
-       // new LSPIdentifier(lspId1), new TunnelIdentifier(tunnelId1), new IPv4ExtendedTunnelIdentifier(new
-       // IPv4Address(extendedTunnelID1))));
-       // final byte[] ipv6Address = { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x9A, (byte) 0xBC, (byte)
-       // 0xDE, (byte) 0xF0, (byte) 0x12,
-       // (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x9A, (byte) 0xBC, (byte) 0xDE, (byte) 0xF0 };
-       // final byte[] tunnelId2 = { (byte) 0xFF, (byte) 0xFF };
-       // final byte[] extendedTunnelID2 = { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x12, (byte) 0x34,
-       // (byte) 0x56, (byte) 0x78, (byte) 0x01,
-       // (byte) 0x23, (byte) 0x45, (byte) 0x67, (byte) 0x01, (byte) 0x23, (byte) 0x45, (byte) 0x67 };
-       // final byte[] lspId2 = { (byte) 0x12, (byte) 0x34 };
-       // assertEquals(tlvsToTest.get(9), new IPv6LSPIdentifiersTlv(new IPv6Address(ipv6Address),
-       // new LSPIdentifier(lspId2), new TunnelIdentifier(tunnelId2), new IPv6ExtendedTunnelIdentifier(new
-       // IPv6Address(extendedTunnelID2))));
-       // assertEquals(tlvsToTest.get(10), new RSVPErrorSpecTlv<IPv4Address>(new IPv4Address(ipv4Address), false, true,
-       // 0x92, 0x1602));
-       // assertEquals(tlvsToTest.get(11), new RSVPErrorSpecTlv<IPv6Address>(new IPv6Address(ipv6Address), true, false,
-       // 0xD5, 0xC5D9));
-       // assertEquals(tlvsToTest.get(12), new ReqMissingTlv(0xF7823517L));
-       // final byte[] valueBytes = { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF };
-       // assertEquals(tlvsToTest.get(13), new NodeIdentifierTlv(valueBytes));
-       // assertEquals(tlvsToTest.get(14), new OrderTlv(0xFFFFFFFFL, 0x00000001L));
-       // assertEquals(tlvsToTest.get(15), new OFListTlv(new ArrayList<PCEPOFCodes>() {
-       // private static final long serialVersionUID = 1L;
-       //
-       // {
-       // this.add(PCEPOFCodes.MCC);
-       // this.add(PCEPOFCodes.MCP);
-       // this.add(PCEPOFCodes.MLL);
-       // }
-       // }));
-       // assertEquals(tlvsToTest.get(16), new P2MPCapabilityTlv(2));
-       //
-       // assertArrayEquals(bytesFromFile, PCEPTlvParser.put(tlvsToTest));
-       // }
-       //
-       // @Test
-       // public void testDifferentLengthExceptions() {
-       // final byte[] bytes = { (byte) 0x00 }; // not empty but not enought data
-       // // for parsing subobjects
-       //
-       // try {
-       // LSPIdentifierIPv4TlvParser.parse(bytes);
-       // fail("");
-       // } catch (final PCEPDeserializerException e) {
-       // }
-       //
-       // try {
-       // LSPIdentifierIPv6TlvParser.parse(bytes);
-       // fail("");
-       // } catch (final PCEPDeserializerException e) {
-       // }
-       //
-       // try {
-       // PCEStatefulCapabilityTlvParser.deserializeValueField(bytes);
-       // fail("");
-       // } catch (final PCEPDeserializerException e) {
-       // }
-       //
-       // try {
-       // RSVPErrorSpecTlvParser.parse(bytes);
-       // fail("");
-       // } catch (final PCEPDeserializerException e) {
-       // }
-       //
-       // try {
-       // RSVPErrorSpecIPv6TlvParser.parse(bytes);
-       // fail("");
-       // } catch (final PCEPDeserializerException e) {
-       // }
-       //
-       // try {
-       // OFListTlvParser.parse(bytes);
-       // fail("");
-       // } catch (final PCEPDeserializerException e) {
-       // }
-       // }
-       //
-       // @Test
-       // public void testUnknownInstanceExceptions() {
-       // try {
-       // LSPIdentifierIPv4TlvParser.put(null);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // try {
-       // LSPIdentifierIPv6TlvParser.put(null);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // try {
-       // PCEStatefulCapabilityTlvParser.serializeValueField(null);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // try {
-       // RSVPErrorSpecTlvParser.put(null);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // try {
-       // RSVPErrorSpecIPv6TlvParser.put(null);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // try {
-       // OFListTlvParser.put(null);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // }
-       //
-       // @Test
-       // public void testEmptyExceptions() throws PCEPDeserializerException {
-       // final byte[] bytes = {}; // empty
-       //
-       // try {
-       // LSPIdentifierIPv4TlvParser.parse(bytes);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // try {
-       // LSPIdentifierIPv6TlvParser.parse(bytes);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // try {
-       // PCEStatefulCapabilityTlvParser.deserializeValueField(bytes);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // try {
-       // RSVPErrorSpecTlvParser.parse(bytes);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // try {
-       // RSVPErrorSpecIPv6TlvParser.parse(bytes);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       //
-       // try {
-       // OFListTlvParser.parse(bytes);
-       // fail("");
-       // } catch (final IllegalArgumentException e) {
-       // }
-       // }
+    @Test(expected = IllegalArgumentException.class)
+    public void testUnsupportedPSTSerializer() {
+        final PathSetupTypeTlvParser parser = new PathSetupTypeTlvParser();
+        final PathSetupType pstTlv = new PathSetupTypeBuilder().setPst(Uint8.ONE).build();
+        final ByteBuf buff = Unpooled.buffer();
+        parser.serializeTlv(pstTlv, buff);
+    }
 }