From 9d3d30e57bbbc5e809906e7e21f2e3eb3fd23e08 Mon Sep 17 00:00:00 2001 From: Milos Fabian Date: Wed, 26 Oct 2016 11:49:07 +0200 Subject: [PATCH] Introduce BGPTableType Registry The registry is holding supported AFI/SAFI in form of BGPTableType and OpenConfig AfiSafiType. Currenlty, this two AFI/SAFI representations mapping is held in static map, which lacks of extensibility. The registry provider context is supposed to be activated in BGP-MP extensions. The registry would be consumed in BGP configuration mapping procedures. Change-Id: Ib34147f56d85bf418b29924d6d1f805d4ed1a757 Signed-off-by: Milos Fabian --- bgp/openconfig-spi/pom.xml | 9 +++ ...BGPTableTypeRegistryProviderActivator.java | 43 ++++++++++++++ .../spi/BGPTableTypeRegistryConsumer.java | 36 +++++++++++ .../spi/BGPTableTypeRegistryProvider.java | 33 +++++++++++ ...BGPTableTypeRegistryProviderActivator.java | 19 ++++++ .../SimpleBGPTableTypeRegistryProvider.java | 56 ++++++++++++++++++ ...BGPTableTypeRegistryProviderActivator.java | 42 +++++++++++++ .../blueprint/bgp-openconfig-spi.xml | 21 +++++++ ...ableTypeRegistryProviderActivatorTest.java | 39 ++++++++++++ ...ableTypeRegistryProviderActivatorTest.java | 39 ++++++++++++ ...impleBGPTableTypeRegistryProviderTest.java | 59 +++++++++++++++++++ 11 files changed, 396 insertions(+) create mode 100644 bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/AbstractBGPTableTypeRegistryProviderActivator.java create mode 100644 bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryConsumer.java create mode 100644 bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProvider.java create mode 100644 bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProviderActivator.java create mode 100644 bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProvider.java create mode 100644 bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderActivator.java create mode 100644 bgp/openconfig-spi/src/main/resources/org/opendaylight/blueprint/bgp-openconfig-spi.xml create mode 100644 bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProviderActivatorTest.java create mode 100644 bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderActivatorTest.java create mode 100644 bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderTest.java diff --git a/bgp/openconfig-spi/pom.xml b/bgp/openconfig-spi/pom.xml index 0598cdf319..53be7d4ca4 100644 --- a/bgp/openconfig-spi/pom.xml +++ b/bgp/openconfig-spi/pom.xml @@ -32,6 +32,15 @@ ${project.groupId} bgp-openconfig-api + + + junit + junit + + + org.mockito + mockito-core + diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/AbstractBGPTableTypeRegistryProviderActivator.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/AbstractBGPTableTypeRegistryProviderActivator.java new file mode 100644 index 0000000000..8e58abad8c --- /dev/null +++ b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/AbstractBGPTableTypeRegistryProviderActivator.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016 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.openconfig.spi; + +import com.google.common.base.Preconditions; +import java.util.List; +import javax.annotation.concurrent.GuardedBy; +import org.opendaylight.yangtools.concepts.AbstractRegistration; + +public abstract class AbstractBGPTableTypeRegistryProviderActivator implements AutoCloseable, BGPTableTypeRegistryProviderActivator { + + @GuardedBy("this") + private List registrations; + + @GuardedBy("this") + protected abstract List startBGPTableTypeRegistryProviderImpl(BGPTableTypeRegistryProvider provider); + + @Override + public final synchronized void startBGPTableTypeRegistryProvider(final BGPTableTypeRegistryProvider provider) { + Preconditions.checkState(this.registrations == null); + this.registrations = Preconditions.checkNotNull(startBGPTableTypeRegistryProviderImpl(provider)); + } + + @Override + public final synchronized void stopBGPTableTypeRegistryProvider() { + if (this.registrations == null) { + return; + } + this.registrations.forEach(AbstractRegistration::close); + this.registrations = null; + } + + @Override + public final void close() { + stopBGPTableTypeRegistryProvider(); + }; +} diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryConsumer.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryConsumer.java new file mode 100644 index 0000000000..3da3a5f823 --- /dev/null +++ b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryConsumer.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2016 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.openconfig.spi; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; + +/** + * Provides access to BGP AFI/SAFI registry. + * + */ +public interface BGPTableTypeRegistryConsumer { + + /** + * Looks for BgpTableType based on OpenConfig AFI/SAFI. + * @param afiSafiType + * @return Optional of BgpTableType or empty, if the table type is not supported. + */ + @Nonnull Optional getTableType(@Nonnull Class afiSafiType); + + /** + * Looks for AfiSafiType based on BgpTableType. + * @param bgpTableType + * @return Optional of OpenConfig AFI/SAFI or empty, if the table type is not supported. + */ + @Nonnull Optional> getAfiSafiType(@Nonnull BgpTableType bgpTableType); + +} diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProvider.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProvider.java new file mode 100644 index 0000000000..210583db0c --- /dev/null +++ b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProvider.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016 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.openconfig.spi; + +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; +import org.opendaylight.yangtools.concepts.AbstractRegistration; + +/** + * The BGP extension may provide supported table type (AFI/SAFI). + * + */ +public interface BGPTableTypeRegistryProvider extends BGPTableTypeRegistryConsumer { + + /** + * Register supported AFI/SAFI. + * @param afi Local representation of AFI. + * @param safi Local representation of SAFI. + * @param afiSafiType OpenConfig AFI/SAFI representation. + * @return Registration ticket. + */ + @Nonnull AbstractRegistration registerBGPTableType(@Nonnull Class afi, + @Nonnull Class safi, @Nonnull Class afiSafiType); + +} diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProviderActivator.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProviderActivator.java new file mode 100644 index 0000000000..4c1e858ce1 --- /dev/null +++ b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProviderActivator.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2016 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.openconfig.spi; + +import javax.annotation.Nonnull; + +public interface BGPTableTypeRegistryProviderActivator { + + void startBGPTableTypeRegistryProvider(@Nonnull BGPTableTypeRegistryProvider provider); + + void stopBGPTableTypeRegistryProvider(); + +} diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProvider.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProvider.java new file mode 100644 index 0000000000..445b1f43f2 --- /dev/null +++ b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProvider.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016 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.openconfig.spi; + +import com.google.common.base.Preconditions; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import java.util.Optional; +import javax.annotation.concurrent.GuardedBy; +import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; +import org.opendaylight.yangtools.concepts.AbstractRegistration; + +public final class SimpleBGPTableTypeRegistryProvider implements BGPTableTypeRegistryProvider { + + @GuardedBy("this") + private final BiMap> tableTypes = HashBiMap.create(); + + @Override + public synchronized AbstractRegistration registerBGPTableType(final Class afi, + final Class safi, final Class afiSafiType) { + final BgpTableType tableType = new BgpTableTypeImpl(afi, safi); + final Class prev = this.tableTypes.putIfAbsent(tableType, afiSafiType); + Preconditions.checkState(prev == null, "AFI %s SAFI %s is already registered with %s", afi, safi, prev); + return new AbstractRegistration() { + @Override + protected void removeRegistration() { + synchronized (SimpleBGPTableTypeRegistryProvider.this) { + SimpleBGPTableTypeRegistryProvider.this.tableTypes.remove(tableType); + } + } + }; + } + + @Override + public synchronized Optional getTableType(final Class afiSafiType) { + final BgpTableType tableType = this.tableTypes.inverse().get(afiSafiType); + return Optional.ofNullable(tableType); + } + + @Override + public synchronized Optional> getAfiSafiType(final BgpTableType bgpTableType) { + final Class afiSafi = this.tableTypes.get(bgpTableType); + return Optional.ofNullable(afiSafi); + } + +} diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderActivator.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderActivator.java new file mode 100644 index 0000000000..4e02769550 --- /dev/null +++ b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderActivator.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 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.openconfig.spi; + +import com.google.common.base.Preconditions; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class SimpleBGPTableTypeRegistryProviderActivator implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(SimpleBGPTableTypeRegistryProviderActivator.class); + + private final BGPTableTypeRegistryProvider providerContext; + private final List extensionActivators; + + public SimpleBGPTableTypeRegistryProviderActivator(final BGPTableTypeRegistryProvider providerContext, + final List extensionActivators) { + this.providerContext = Preconditions.checkNotNull(providerContext); + this.extensionActivators = Preconditions.checkNotNull(extensionActivators); + } + + public void start() { + LOG.info("Starting {} BGPTableTypeRegistryProviderActivator instances", this.extensionActivators.size()); + + this.extensionActivators.forEach(activator -> activator.startBGPTableTypeRegistryProvider(this.providerContext)); + } + + @Override + public void close() { + LOG.info("Stopping {} BGPTableTypeRegistryProviderActivator instances", this.extensionActivators.size()); + + this.extensionActivators.forEach(BGPTableTypeRegistryProviderActivator::stopBGPTableTypeRegistryProvider); + } + +} diff --git a/bgp/openconfig-spi/src/main/resources/org/opendaylight/blueprint/bgp-openconfig-spi.xml b/bgp/openconfig-spi/src/main/resources/org/opendaylight/blueprint/bgp-openconfig-spi.xml new file mode 100644 index 0000000000..f10c5db8aa --- /dev/null +++ b/bgp/openconfig-spi/src/main/resources/org/opendaylight/blueprint/bgp-openconfig-spi.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer + org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryProvider + + + \ No newline at end of file diff --git a/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProviderActivatorTest.java b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProviderActivatorTest.java new file mode 100644 index 0000000000..be84c9b7d2 --- /dev/null +++ b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPTableTypeRegistryProviderActivatorTest.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016 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.openconfig.spi; + +import java.util.Collections; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily; +import org.opendaylight.yangtools.concepts.AbstractRegistration; + +public class BGPTableTypeRegistryProviderActivatorTest { + + @Test + public void testBGPTableTypeRegistryProviderActivator() { + final AbstractBGPTableTypeRegistryProviderActivator activator = new AbstractBGPTableTypeRegistryProviderActivator(){ + @Override + protected List startBGPTableTypeRegistryProviderImpl( + final BGPTableTypeRegistryProvider provider) { + return Collections.singletonList(provider.registerBGPTableType(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, IPV4UNICAST.class)); + }}; + + final SimpleBGPTableTypeRegistryProvider provider = new SimpleBGPTableTypeRegistryProvider(); + activator.startBGPTableTypeRegistryProvider(provider); + Assert.assertTrue(provider.getTableType(IPV4UNICAST.class).isPresent()); + activator.stopBGPTableTypeRegistryProvider(); + Assert.assertFalse(provider.getTableType(IPV4UNICAST.class).isPresent()); + activator.close(); + } + +} diff --git a/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderActivatorTest.java b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderActivatorTest.java new file mode 100644 index 0000000000..6856fb784a --- /dev/null +++ b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderActivatorTest.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016 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.openconfig.spi; + +import java.util.Collections; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +public class SimpleBGPTableTypeRegistryProviderActivatorTest { + + @Mock + private BGPTableTypeRegistryProviderActivator providerActivator; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testSimpleBGPTableTypeRegistryProviderActivator() { + final SimpleBGPTableTypeRegistryProvider provider = new SimpleBGPTableTypeRegistryProvider(); + final SimpleBGPTableTypeRegistryProviderActivator activator = new SimpleBGPTableTypeRegistryProviderActivator(provider, + Collections.singletonList(this.providerActivator)); + activator.start(); + Mockito.verify(this.providerActivator).startBGPTableTypeRegistryProvider(Mockito.any()); + activator.close(); + Mockito.verify(this.providerActivator).stopBGPTableTypeRegistryProvider(); + } + +} diff --git a/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderTest.java b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderTest.java new file mode 100644 index 0000000000..9a4b66c1ee --- /dev/null +++ b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/SimpleBGPTableTypeRegistryProviderTest.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016 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.openconfig.spi; + +import java.util.Optional; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily; +import org.opendaylight.yangtools.concepts.AbstractRegistration; + +public class SimpleBGPTableTypeRegistryProviderTest { + + private BGPTableTypeRegistryProvider provider; + private AbstractRegistration registration; + + @Before + public void setUp() { + this.provider = new SimpleBGPTableTypeRegistryProvider(); + this.registration = this.provider.registerBGPTableType(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, IPV4UNICAST.class); + } + + @Test + public void testBGPTableTypeRegistryProvider() { + + final Optional> afiSafiType = this.provider.getAfiSafiType(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); + Assert.assertTrue(afiSafiType.isPresent()); + final Optional> afiSafiType2 = this.provider.getAfiSafiType(new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class)); + Assert.assertFalse(afiSafiType2.isPresent()); + + final Optional tableType = this.provider.getTableType(IPV4UNICAST.class); + Assert.assertTrue(tableType.isPresent()); + final Optional tableType2 = this.provider.getTableType(IPV6UNICAST.class); + Assert.assertFalse(tableType2.isPresent()); + + this.registration.close(); + final Optional tableType3 = this.provider.getTableType(IPV4UNICAST.class); + Assert.assertFalse(tableType3.isPresent()); + } + + @Test(expected=IllegalStateException.class) + public void testDuplicatedRegistration() { + this.provider.registerBGPTableType(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, IPV4UNICAST.class); + } + +} -- 2.36.6