BGPCEP Tests 95/22795/3
authorClaudio D. Gasparini <cgaspari@cisco.com>
Wed, 17 Jun 2015 11:11:38 +0000 (13:11 +0200)
committerClaudio D. Gasparini <cgaspari@cisco.com>
Thu, 18 Jun 2015 14:36:03 +0000 (16:36 +0200)
PCEPExtensionProviderContextTest
LinkstateRIBSupportTest
FlowspecModuleTest

Change-Id: Ieec83b4dec1b010355a1001cf0f5adda4094c524
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
bgp/flowspec/pom.xml
bgp/flowspec/src/test/java/org/opendaylight/controller/config/yang/bgp/flowspec/FlowspecModuleTest.java [new file with mode: 0644]
bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateRIBSupportTest.java [new file with mode: 0644]
pcep/spi/src/test/java/org/opendaylight/controller/config/yang/pcep/spi/ReusablePCEPExtensionProviderContextTest.java [new file with mode: 0644]

index 123f1aeaa65ad5f0e9a4396d40b049d69f1025f5..b343a1d55cb3a62f52aa61533c747c79c6d28ec2 100644 (file)
             <scope>provided</scope>
          </dependency>
          <!-- test scope dependencies -->
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-manager</artifactId>
+            <type>test-jar</type>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>bgp-rib-spi</artifactId>
+            <type>test-jar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-manager</artifactId>
+            <scope>test</scope>
+        </dependency>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
diff --git a/bgp/flowspec/src/test/java/org/opendaylight/controller/config/yang/bgp/flowspec/FlowspecModuleTest.java b/bgp/flowspec/src/test/java/org/opendaylight/controller/config/yang/bgp/flowspec/FlowspecModuleTest.java
new file mode 100644 (file)
index 0000000..5693e86
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. 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.controller.config.yang.bgp.flowspec;
+
+import com.google.common.collect.Lists;
+import javax.management.ObjectName;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.controller.config.api.jmx.CommitStatus;
+import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
+import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
+import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
+import org.opendaylight.controller.config.yang.bgp.parser.spi.SimpleBGPExtensionProviderContextModuleFactory;
+import org.opendaylight.controller.config.yang.bgp.parser.spi.SimpleBGPExtensionProviderContextModuleTest;
+import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleFactory;
+import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleTest;
+
+/**
+ * Created by cgasparini on 18.6.2015.
+ */
+public class FlowspecModuleTest extends AbstractConfigTest {
+
+    private static final String FACTORY_NAME = FlowspecModuleFactory.NAME;
+    private static final String INSTANCE_NAME = "bgp-flowspec-impl";
+
+    @Before
+    public void setUp() {
+        super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, new FlowspecModuleFactory(),
+            new SimpleBGPExtensionProviderContextModuleFactory(), new RIBExtensionsImplModuleFactory()));
+    }
+
+    @Test
+    public void testLSTypeDefaultValue() throws Exception {
+        final CommitStatus status = createFlowspecModuleInstance();
+        assertBeanCount(1, FACTORY_NAME);
+        assertStatus(status, 3, 0, 0);
+    }
+
+    @Test
+    public void testCreateBean() throws Exception {
+        final CommitStatus status = createFlowspecModuleInstance();
+        assertBeanCount(1, FACTORY_NAME);
+        assertStatus(status, 3, 0, 0);
+    }
+
+    @Test
+    public void testReusingOldInstance() throws Exception {
+        createFlowspecModuleInstance();
+        final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        assertBeanCount(1, FACTORY_NAME);
+        final CommitStatus status = transaction.commit();
+        assertBeanCount(1, FACTORY_NAME);
+        assertStatus(status, 0, 0, 3);
+    }
+
+    @Test
+    public void testReconfigureInstance() throws Exception {
+        createFlowspecModuleInstance();
+        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        assertBeanCount(1, FACTORY_NAME);
+        CommitStatus status = transaction.commit();
+        assertBeanCount(1, FACTORY_NAME);
+        assertStatus(status, 0, 0, 3);
+    }
+
+    private CommitStatus createFlowspecModuleInstance() throws Exception {
+        final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        final ObjectName flowspecON = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
+
+        SimpleBGPExtensionProviderContextModuleTest.createBGPExtensionsModuleInstance(transaction, Lists.newArrayList(flowspecON));
+        RIBExtensionsImplModuleTest.createRIBExtensionsModuleInstance(transaction, Lists.newArrayList(flowspecON));
+        return transaction.commit();
+    }
+
+}
\ No newline at end of file
diff --git a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateRIBSupportTest.java b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateRIBSupportTest.java
new file mode 100644 (file)
index 0000000..04f8abe
--- /dev/null
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. 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.protocol.bgp.linkstate;
+
+import static org.junit.Assert.assertEquals;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
+import org.opendaylight.protocol.bgp.linkstate.nlri.LinkstateNlriParser;
+import org.opendaylight.protocol.bgp.linkstate.nlri.NodeNlriParser;
+import org.opendaylight.protocol.bgp.parser.BGPParsingException;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.destination.CLinkstateDestination;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.CRouterIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Routes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListNodeBuilder;
+
+/**
+ * Created by cgasparini on 17.6.2015.
+ */
+public class LinkstateRIBSupportTest {
+
+    private static final Ipv4Address ipv4 = new Ipv4Address("42.42.42.42");
+    final LinkstateRIBSupport link = LinkstateRIBSupport.getInstance();
+    final List<MapEntryNode> linkList = new ArrayList<>();
+    private List<YangInstanceIdentifier> routes;
+
+    @Mock
+    private DOMDataWriteTransaction tx;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        routes = new ArrayList<>();
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public Object answer(final InvocationOnMock invocation) throws Throwable {
+                final Object[] args = invocation.getArguments();
+                LinkstateRIBSupportTest.this.routes.add((YangInstanceIdentifier) args[1]);
+                return args[1];
+            }
+        }).when(this.tx).put(Mockito.any(LogicalDatastoreType.class), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
+
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public Object answer(final InvocationOnMock invocation) throws Throwable {
+                final Object[] args = invocation.getArguments();
+                LinkstateRIBSupportTest.this.routes.remove((YangInstanceIdentifier) args[1]);
+                return args[1];
+            }
+        }).when(this.tx).delete(Mockito.any(LogicalDatastoreType.class), Mockito.any(YangInstanceIdentifier.class));
+    }
+
+    @Test
+    public void testbuildReach() throws BGPParsingException {
+        final CNextHop hop = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(ipv4).build()).build();
+        MpReachNlri result = link.buildReach(linkList, hop);
+        assertEquals(LinkstateAddressFamily.class, result.getAfi());
+        assertEquals(LinkstateSubsequentAddressFamily.class, result.getSafi());
+        assertEquals(new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("42.42.42.42")).build()).build(), result.getCNextHop());
+    }
+
+    @Test
+    public void testBuildUnreach() {
+        final MpUnreachNlri result = link.buildUnreach(linkList);
+        assertEquals(LinkstateAddressFamily.class, result.getAfi());
+        assertEquals(LinkstateSubsequentAddressFamily.class, result.getSafi());
+    }
+
+    @Test
+    public void testDestinationRoutes() {
+        final YangInstanceIdentifier yangIdentifier = YangInstanceIdentifier.of(Routes.QNAME);
+
+        final DataContainerNodeAttrBuilder<NodeIdentifier, UnkeyedListEntryNode> linkstateBI = ImmutableUnkeyedListEntryNodeBuilder.create();
+        linkstateBI.withNodeIdentifier(new NodeIdentifier(CLinkstateDestination.QNAME));
+
+        final ImmutableLeafNodeBuilder<String> protocolId = new ImmutableLeafNodeBuilder<>();
+        protocolId.withNodeIdentifier(LinkstateNlriParser.PROTOCOL_ID_NID);
+        protocolId.withValue("isis-level2");
+        linkstateBI.addChild(protocolId.build());
+
+        final ImmutableLeafNodeBuilder<BigInteger> identifier = new ImmutableLeafNodeBuilder<>();
+        identifier.withNodeIdentifier(LinkstateNlriParser.IDENTIFIER_NID);
+        identifier.withValue(BigInteger.ONE);
+        linkstateBI.addChild(identifier.build());
+
+        final DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> objectType = Builders.choiceBuilder();
+        objectType.withNodeIdentifier(LinkstateNlriParser.OBJECT_TYPE_NID);
+
+        final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> nodeDescriptors = Builders.containerBuilder();
+        nodeDescriptors.withNodeIdentifier(LinkstateNlriParser.NODE_DESCRIPTORS_NID);
+
+        final ImmutableLeafNodeBuilder<Long> asNumber = new ImmutableLeafNodeBuilder<>();
+        asNumber.withNodeIdentifier(NodeNlriParser.AS_NUMBER_NID);
+        asNumber.withValue(72L);
+        nodeDescriptors.addChild(asNumber.build());
+
+        final ImmutableLeafNodeBuilder<Long> areaID = new ImmutableLeafNodeBuilder<>();
+        areaID.withNodeIdentifier(NodeNlriParser.AREA_NID);
+        areaID.withValue(2697513L);
+        nodeDescriptors.addChild(areaID.build());
+
+        final ImmutableLeafNodeBuilder<Long> domainID = new ImmutableLeafNodeBuilder<>();
+        domainID.withNodeIdentifier(NodeNlriParser.DOMAIN_NID);
+        domainID.withValue(0x28282828L);
+        nodeDescriptors.addChild(domainID.build());
+
+        final DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> crouterId = Builders.choiceBuilder();
+        crouterId.withNodeIdentifier(new NodeIdentifier(CRouterIdentifier.QNAME));
+
+        final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> isisNode = Builders.containerBuilder();
+        isisNode.withNodeIdentifier(NodeNlriParser.ISIS_PSEUDONODE_NID);
+
+        final ImmutableLeafNodeBuilder<byte[]> isoSystemID = new ImmutableLeafNodeBuilder<>();
+        isoSystemID.withNodeIdentifier(NodeNlriParser.ISO_SYSTEM_NID);
+        isoSystemID.withValue(new byte[]{0, 0, 0, 0, 0, (byte) 0x39});
+        isisNode.addChild(isoSystemID.build());
+        isisNode.addChild(Builders.leafBuilder().withNodeIdentifier(NodeNlriParser.PSN_NID).withValue((short) 5).build());
+        crouterId.addChild(isisNode.build());
+
+        nodeDescriptors.addChild(crouterId.build());
+        objectType.addChild(nodeDescriptors.build());
+        linkstateBI.addChild(objectType.build());
+
+        final UnkeyedListNode routes = ImmutableUnkeyedListNodeBuilder.create()
+            .withNodeIdentifier(new NodeIdentifier(CLinkstateDestination.QNAME))
+            .addChild(linkstateBI.build())
+            .build();
+
+        final ContainerNode destination = ImmutableContainerNodeBuilder.create().
+            addChild(routes)
+            .withNodeIdentifier(new NodeIdentifier(CLinkstateDestination.QNAME))
+            .build();
+
+        final ContainerNode attributes = ImmutableContainerNodeBuilder.create()
+            .withNodeIdentifier(new NodeIdentifier(Attributes.QNAME))
+            .build();
+
+        link.putDestinationRoutes(tx, yangIdentifier, destination, attributes);
+
+        Assert.assertEquals(1, this.routes.size());
+
+        link.deleteDestinationRoutes(tx, yangIdentifier, destination);
+
+        Assert.assertEquals(0, this.routes.size());
+    }
+
+}
\ No newline at end of file
diff --git a/pcep/spi/src/test/java/org/opendaylight/controller/config/yang/pcep/spi/ReusablePCEPExtensionProviderContextTest.java b/pcep/spi/src/test/java/org/opendaylight/controller/config/yang/pcep/spi/ReusablePCEPExtensionProviderContextTest.java
new file mode 100644 (file)
index 0000000..70d4d55
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. 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.controller.config.yang.pcep.spi;
+
+import static org.junit.Assert.assertEquals;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.opendaylight.protocol.pcep.spi.EROSubobjectParser;
+import org.opendaylight.protocol.pcep.spi.EROSubobjectSerializer;
+import org.opendaylight.protocol.pcep.spi.LabelParser;
+import org.opendaylight.protocol.pcep.spi.LabelSerializer;
+import org.opendaylight.protocol.pcep.spi.MessageParser;
+import org.opendaylight.protocol.pcep.spi.MessageSerializer;
+import org.opendaylight.protocol.pcep.spi.ObjectHeaderImpl;
+import org.opendaylight.protocol.pcep.spi.ObjectParser;
+import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
+import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
+import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderActivator;
+import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
+import org.opendaylight.protocol.pcep.spi.RROSubobjectParser;
+import org.opendaylight.protocol.pcep.spi.RROSubobjectSerializer;
+import org.opendaylight.protocol.pcep.spi.TlvParser;
+import org.opendaylight.protocol.pcep.spi.TlvSerializer;
+import org.opendaylight.protocol.pcep.spi.XROSubobjectParser;
+import org.opendaylight.protocol.pcep.spi.XROSubobjectSerializer;
+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.message.rev131007.Keepalive;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.KeepaliveBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.exclude.route.object.xro.Subobject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.exclude.route.object.xro.SubobjectBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.list.tlv.OfList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.list.tlv.OfListBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.EnterpriseSpecificInformation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.objects.VendorInformationObject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.subobject.type.AsNumberCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.subobject.type.AsNumberCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.subobject.type.IpPrefixCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.label.subobject.LabelType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.label.subobject.label.type.Type1LabelCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.label.subobject.label.type.Type1LabelCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.record.route.subobjects.subobject.type.IpPrefixCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.record.route.subobjects.subobject.type.LabelCase;
+
+/**
+ * Created by cgasparini on 17.6.2015.
+ */
+public class ReusablePCEPExtensionProviderContextTest {
+
+    List<PCEPExtensionProviderContext> AuxList = new ArrayList<>();
+
+    @Mock
+    XROSubobjectParser xroParser;
+    @Mock
+    XROSubobjectSerializer xroSerializer;
+
+    @Mock
+    RROSubobjectParser rroParser;
+    @Mock
+    RROSubobjectSerializer rroSerializer;
+
+    @Mock
+    EROSubobjectParser eroParser;
+    @Mock
+    EROSubobjectSerializer eroSerializer;
+
+    @Mock
+    TlvParser tlvParser;
+    @Mock
+    TlvSerializer tlvSerializer;
+
+    @Mock
+    ObjectParser objectParser;
+    @Mock
+    ObjectSerializer objectSerializer;
+
+    @Mock
+    MessageParser msgParser;
+    @Mock
+    MessageSerializer msgSerializer;
+
+    @Mock
+    LabelParser labelParser;
+    @Mock
+    LabelSerializer labelSerializer;
+    @Mock
+    VendorInformationTlv viTlv;
+    @Mock
+    EnterpriseSpecificInformation es;
+    @Mock
+    VendorInformationObject esi;
+
+    @Before
+    public void setUp() throws PCEPDeserializerException {
+        MockitoAnnotations.initMocks(this);
+
+        Mockito.doReturn(null).when(this.xroParser).parseSubobject(Mockito.any(ByteBuf.class), Mockito.anyBoolean());
+        Mockito.doNothing().when(this.xroSerializer).serializeSubobject(Mockito.any(Subobject.class), Mockito.any(ByteBuf.class));
+
+        Mockito.doReturn(null).when(this.rroParser).parseSubobject(Mockito.any(ByteBuf.class));
+        Mockito.doNothing().when(this.rroSerializer).serializeSubobject(Mockito.any(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.rro.Subobject.class), Mockito.any(ByteBuf.class));
+
+        Mockito.doReturn(null).when(this.eroParser).parseSubobject(Mockito.any(ByteBuf.class), Mockito.anyBoolean());
+        Mockito.doNothing().when(this.eroSerializer).serializeSubobject(Mockito.any(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject.class), Mockito.any(ByteBuf.class));
+
+        Mockito.doReturn(this.viTlv).when(this.tlvParser).parseTlv(Mockito.any(ByteBuf.class));
+        Mockito.doNothing().when(this.tlvSerializer).serializeTlv(Mockito.any(Tlv.class), Mockito.any(ByteBuf.class));
+
+        Mockito.doReturn(new OpenBuilder().build()).when(this.objectParser).parseObject(Mockito.any(ObjectHeader.class), Mockito.any(ByteBuf.class));
+        Mockito.doNothing().when(this.objectSerializer).serializeObject(Mockito.any(org.opendaylight.yang.gen.v1.urn
+            .opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object.class), Mockito.any(ByteBuf.class));
+
+        Mockito.doReturn(null).when(this.msgParser).parseMessage(Mockito.any(ByteBuf.class), Mockito.any(List.class));
+        Mockito.doNothing().when(this.msgSerializer).serializeMessage(Mockito.any(Message.class), Mockito.any(ByteBuf.class));
+
+        Mockito.doReturn(null).when(this.labelParser).parseLabel(Mockito.any(ByteBuf.class));
+        Mockito.doNothing().when(this.labelSerializer).serializeLabel(Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.any(LabelType.class), Mockito.any(ByteBuf.class));
+
+        Mockito.doReturn(this.es).when(this.esi).getEnterpriseSpecificInformation();
+
+        Mockito.doReturn(EnterpriseSpecificInformation.class).when(this.es).getImplementedInterface();
+
+        Mockito.doReturn(this.es).when(this.viTlv).getEnterpriseSpecificInformation();
+
+        Mockito.doReturn(EnterpriseSpecificInformation.class).when(this.es).getImplementedInterface();
+    }
+
+    @Test
+    public void testReusablePCEPExtensionProviderContext() throws PCEPDeserializerException {
+        List<PCEPExtensionProviderActivator> list = new ArrayList<>();
+        list.add(new simplePCEPExtensionProviderActivator());
+        list.add(new simplePCEPExtensionProviderActivator());
+
+
+        ReusablePCEPExtensionProviderContext ctx = new ReusablePCEPExtensionProviderContext();
+        ctx.start(list);
+
+        assertEquals(2, AuxList.size());
+
+        final List<PCEPExtensionProviderActivator> listReconf = new ArrayList<>();
+        listReconf.add(new simplePCEPExtensionProviderActivator());
+        listReconf.add(new simplePCEPExtensionProviderActivator());
+        listReconf.add(new simplePCEPExtensionProviderActivator());
+        listReconf.add(new simplePCEPExtensionProviderActivator());
+        ctx.reconfigure(listReconf);
+        assertEquals(4, AuxList.size());
+
+        ctx.registerLabelParser(1, this.labelParser);
+        ctx.registerLabelSerializer(Type1LabelCase.class, this.labelSerializer);
+
+        ctx.registerEROSubobjectParser(2, this.eroParser);
+        ctx.registerEROSubobjectSerializer(IpPrefixCase.class, this.eroSerializer);
+
+        ctx.registerMessageParser(6, this.msgParser);
+        ctx.registerMessageSerializer(Keepalive.class, this.msgSerializer);
+
+        ctx.registerObjectParser(5, 1, this.objectParser);
+        ctx.registerObjectSerializer(Rp.class, this.objectSerializer);
+
+        ctx.registerRROSubobjectParser(3, this.rroParser);
+        ctx.registerRROSubobjectSerializer(LabelCase.class, this.rroSerializer);
+
+        ctx.registerTlvParser(1, this.tlvParser);
+        ctx.registerTlvSerializer(OfList.class, this.tlvSerializer);
+
+        ctx.registerXROSubobjectParser(2, this.xroParser);
+        ctx.registerXROSubobjectSerializer(AsNumberCase.class, this.xroSerializer);
+
+        ctx.registerVendorInformationTlvSerializer(EnterpriseSpecificInformation.class, this.tlvSerializer);
+        ctx.registerVendorInformationTlvParser(new EnterpriseNumber(12L), this.tlvParser);
+
+        ctx.registerVendorInformationObjectParser(new EnterpriseNumber(10L), this.objectParser);
+        ctx.registerVendorInformationObjectSerializer(EnterpriseSpecificInformation.class, this.objectSerializer);
+
+        final ByteBuf buffer = Unpooled.buffer();
+        ctx.getEROSubobjectHandlerRegistry().parseSubobject(3, buffer, true);
+
+        ctx.getEROSubobjectHandlerRegistry().serializeSubobject(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.
+            SubobjectBuilder().setSubobjectType(new AsNumberCaseBuilder().build()).build(), buffer);
+
+        ctx.getLabelHandlerRegistry().parseLabel(1, buffer);
+        ctx.getLabelHandlerRegistry().serializeLabel(true, false, new Type1LabelCaseBuilder().build(), buffer);
+
+        ctx.getMessageHandlerRegistry().parseMessage(6, buffer, Collections.<Message>emptyList());
+        ctx.getMessageHandlerRegistry().serializeMessage(new KeepaliveBuilder().build(), buffer);
+
+        ctx.getObjectHandlerRegistry().parseObject(4, 1, new ObjectHeaderImpl(true, false), buffer);
+        ctx.getObjectHandlerRegistry().serializeObject(new OpenBuilder().build(), buffer);
+
+        ctx.getRROSubobjectHandlerRegistry().parseSubobject(4, buffer);
+        ctx.getRROSubobjectHandlerRegistry().serializeSubobject(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.rro.SubobjectBuilder().setSubobjectType(new IpPrefixCaseBuilder().build()).build(), buffer);
+
+        ctx.getTlvHandlerRegistry().parseTlv(2, buffer);
+        ctx.getTlvHandlerRegistry().serializeTlv(new OfListBuilder().build(), buffer);
+
+        ctx.getVendorInformationObjectRegistry().parseVendorInformationObject(new EnterpriseNumber(10L), new ObjectHeaderImpl(true, false), buffer);
+        ctx.getVendorInformationObjectRegistry().serializeVendorInformationObject(this.esi, buffer);
+
+        ctx.getVendorInformationTlvRegistry().parseVendorInformationTlv(new EnterpriseNumber(12L), buffer);
+        ctx.getVendorInformationTlvRegistry().serializeVendorInformationTlv(this.viTlv, buffer);
+
+        ctx.getXROSubobjectHandlerRegistry().parseSubobject(2, buffer, false);
+        ctx.getXROSubobjectHandlerRegistry().serializeSubobject(new SubobjectBuilder().setSubobjectType(new AsNumberCaseBuilder().build()).build(), buffer);
+
+        ctx.close();
+        assertEquals(0, AuxList.size());
+    }
+
+    class simplePCEPExtensionProviderActivator implements PCEPExtensionProviderActivator {
+        @Override
+        public void start(final PCEPExtensionProviderContext context) {
+            AuxList.add(context);
+        }
+
+        @Override
+        public void stop() {
+            AuxList.remove(AuxList.size() - 1);
+        }
+    }
+}
\ No newline at end of file