From a3ba9fa4fa7a6ee68e3a86c4b182af7e66c71993 Mon Sep 17 00:00:00 2001 From: Milos Fabian Date: Tue, 2 Sep 2014 14:12:45 +0200 Subject: [PATCH] Bug-730: More tests for bgp-rib-spi Change-Id: I6aa7994cde4ba1ed42b39b036eaee73b9ec4362f Signed-off-by: Milos Fabian --- .../bgp/rib/spi/TerminationReasonTest.java | 1 + .../bgp/rib/spi/AbstractAdjRIBsTest.java | 236 ++++++++++++++++++ .../bgp/rib/spi/SimpleRIBExtensionTest.java | 47 ++++ 3 files changed, 284 insertions(+) create mode 100644 bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/AbstractAdjRIBsTest.java create mode 100644 bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionTest.java diff --git a/bgp/rib-spi/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/TerminationReasonTest.java b/bgp/rib-spi/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/TerminationReasonTest.java index 4693885e4b..b11fe74fe5 100644 --- a/bgp/rib-spi/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/TerminationReasonTest.java +++ b/bgp/rib-spi/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/TerminationReasonTest.java @@ -18,6 +18,7 @@ public class TerminationReasonTest { @Test public void testTerminationReason() { assertEquals(BGPError.BAD_PEER_AS.toString(), new BGPTerminationReason(BGPError.BAD_PEER_AS).getErrorMessage()); + assertEquals("BGPTerminationReason{error=BAD_PEER_AS}", new BGPTerminationReason(BGPError.BAD_PEER_AS).toString()); } } diff --git a/bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/AbstractAdjRIBsTest.java b/bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/AbstractAdjRIBsTest.java new file mode 100644 index 0000000000..dd8df5281f --- /dev/null +++ b/bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/AbstractAdjRIBsTest.java @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2014 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.rib.spi; + +import com.google.common.collect.Maps; +import java.util.AbstractMap; +import java.util.Map; +import junit.framework.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Matchers; +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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Update; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes1; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes2; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpReachNlri; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpReachNlriBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlri; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlriBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.LocRib; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.ipv4.routes._case.Ipv4Routes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.ipv4.routes._case.ipv4.routes.Ipv4Route; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.ipv4.routes._case.ipv4.routes.Ipv4RouteBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.ipv4.routes._case.ipv4.routes.Ipv4RouteKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.route.AttributesBuilder; +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.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; + +public class AbstractAdjRIBsTest { + + private static final AsNumber TEST_AS_NUMBER = new AsNumber(35L); + + private static final Ipv4Prefix IPV4_PREFIX1 = new Ipv4Prefix("test-prefix1"); + + private static final Ipv4Prefix IPV4_PREFIX2 = new Ipv4Prefix("test-prefix2"); + + private static final InstanceIdentifier RIB_IID = InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(new RibId("test-rib"))).toInstance(); + + private static final KeyedInstanceIdentifier TABLES_IID = RIB_IID.child(LocRib.class).child(Tables.class, new TablesKey(Ipv4AddressFamily.class, + UnicastSubsequentAddressFamily.class)); + + @Mock + private AdjRIBsTransaction ribsTx; + @Mock + private Peer peer; + + private Map, Map.Entry> store = Maps.newHashMap(); + + private final BGPObjectComparator bgpComparator = new BGPObjectComparator(TEST_AS_NUMBER); + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + Mockito.doReturn("").when(this.peer).toString(); + Mockito.doReturn(this.bgpComparator).when(this.ribsTx).comparator(); + Mockito.doAnswer(new Answer() { + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public Void answer(final InvocationOnMock invocation) throws Throwable { + final Object[] args = invocation.getArguments(); + final InstanceIdentifier ii = (InstanceIdentifier) args[2]; + final Route data = (Route) args[4]; + AbstractAdjRIBsTest.this.store.put(ii, new AbstractMap.SimpleEntry(data, false)); + return null; + } + + }).when(this.ribsTx).advertise(Mockito.any(), Mockito.any(), Mockito.>any(), Mockito.any(), Mockito.any(Route.class)); + + Mockito.doAnswer(new Answer() { + @SuppressWarnings("unchecked") + @Override + public Void answer(final InvocationOnMock invocation) throws Throwable { + final Object[] args = invocation.getArguments(); + final InstanceIdentifier ii = (InstanceIdentifier) args[2]; + AbstractAdjRIBsTest.this.store.remove(ii); + return null; + } + + }).when(this.ribsTx).withdraw(Mockito.any(), Mockito.any(), Mockito.>any()); + + Mockito.doAnswer(new Answer() { + @SuppressWarnings("unchecked") + @Override + public Void answer(final InvocationOnMock invocation) throws Throwable { + final Object[] args = invocation.getArguments(); + final InstanceIdentifier basePath = (InstanceIdentifier) args[0]; + final Boolean uptodate = (Boolean) args[1]; + @SuppressWarnings("rawtypes") + Map.Entry entry = new AbstractMap.SimpleEntry(null, uptodate); + AbstractAdjRIBsTest.this.store.put(basePath, entry); + return null; + } + }).when(this.ribsTx).setUptodate(Matchers.>any(), Mockito.anyBoolean()); + } + + @Test + public void testAdjRibs() { + final TestAdjRIBs adjsRib = new TestAdjRIBs(TABLES_IID); + adjsRib.add(this.ribsTx, this.peer, IPV4_PREFIX1, new TestAdjRIBs.TestIpv4RIBEntryData(this.peer, new PathAttributesBuilder().build())); + Mockito.verify(this.ribsTx, Mockito.times(1)).advertise(Mockito.any(), Mockito.any(), Mockito.>any(), Mockito.any(), Mockito.any(Route.class)); + Mockito.verify(this.ribsTx, Mockito.times(1)).setUptodate(Matchers.>any(), Mockito.anyBoolean()); + Assert.assertEquals(2, this.store.size()); + Assert.assertFalse(this.store.get(TABLES_IID).getValue()); + + adjsRib.markUptodate(this.ribsTx, this.peer); + Mockito.verify(this.ribsTx, Mockito.times(2)).setUptodate(Matchers.>any(), Mockito.anyBoolean()); + Assert.assertEquals(2, this.store.size()); + Assert.assertTrue(this.store.get(TABLES_IID).getValue()); + + adjsRib.remove(this.ribsTx, this.peer, IPV4_PREFIX1); + Mockito.verify(this.ribsTx, Mockito.times(1)).withdraw(Mockito.any(), Mockito.any(), Mockito.>any()); + Assert.assertEquals(1, this.store.size()); + + adjsRib.add(this.ribsTx, this.peer, IPV4_PREFIX1, new TestAdjRIBs.TestIpv4RIBEntryData(this.peer, new PathAttributesBuilder().build())); + adjsRib.add(this.ribsTx, this.peer, IPV4_PREFIX2, new TestAdjRIBs.TestIpv4RIBEntryData(this.peer, new PathAttributesBuilder().build())); + Mockito.verify(this.ribsTx, Mockito.times(3)).advertise(Mockito.any(), Mockito.any(), Mockito.>any(), Mockito.any(), Mockito.any(Route.class)); + + adjsRib.addAllEntries(this.ribsTx); + Mockito.verify(this.ribsTx, Mockito.times(5)).advertise(Mockito.any(), Mockito.any(), Mockito.>any(), Mockito.any(), Mockito.any(Route.class)); + Assert.assertEquals(3, this.store.size()); + + adjsRib.clear(this.ribsTx, this.peer); + Mockito.verify(this.ribsTx, Mockito.times(3)).setUptodate(Matchers.>any(), Mockito.anyBoolean()); + Assert.assertEquals(1, this.store.size()); + } + + @Test + public void testEndOfRib() { + final TestAdjRIBs adjsRib = new TestAdjRIBs(TABLES_IID); + final Update endOfRib = adjsRib.endOfRib(); + final PathAttributes1 attr1 = endOfRib.getPathAttributes().getAugmentation(PathAttributes1.class); + Assert.assertNotNull(attr1); + Assert.assertEquals(Ipv4AddressFamily.class, attr1.getMpReachNlri().getAfi()); + Assert.assertEquals(UnicastSubsequentAddressFamily.class, attr1.getMpReachNlri().getSafi()); + } + + @Test + public void testUpdateMsgFor() { + final TestAdjRIBs adjsRib = new TestAdjRIBs(TABLES_IID); + final Update update1 = adjsRib.updateMessageFor(IPV4_PREFIX1, new Ipv4RouteBuilder().setAttributes(new AttributesBuilder().build()).build()); + final PathAttributes1 attr1 = update1.getPathAttributes().getAugmentation(PathAttributes1.class); + Assert.assertNotNull(attr1); + Assert.assertEquals(Ipv4AddressFamily.class, attr1.getMpReachNlri().getAfi()); + Assert.assertEquals(UnicastSubsequentAddressFamily.class, attr1.getMpReachNlri().getSafi()); + + final Update update2 = adjsRib.updateMessageFor(IPV4_PREFIX2, null); + final PathAttributes2 attr2 = update2.getPathAttributes().getAugmentation(PathAttributes2.class); + Assert.assertNotNull(attr2); + Assert.assertEquals(Ipv4AddressFamily.class, attr2.getMpUnreachNlri().getAfi()); + Assert.assertEquals(UnicastSubsequentAddressFamily.class, attr2.getMpUnreachNlri().getSafi()); + } + + private static final class TestAdjRIBs extends AbstractAdjRIBs { + + private static final class TestIpv4RIBEntryData extends RIBEntryData { + + private final PathAttributes attributes; + + protected TestIpv4RIBEntryData(final Peer peer, final PathAttributes attributes) { + super(peer, attributes); + this.attributes = attributes; + } + + @Override + protected Ipv4Route getDataObject(final Ipv4Prefix key, final Ipv4RouteKey id) { + return new Ipv4RouteBuilder().setKey(id).setAttributes(new AttributesBuilder(this.attributes).build()).build(); + } + + } + + protected TestAdjRIBs(KeyedInstanceIdentifier basePath) { + super(basePath); + } + + @Override + public void addRoutes(AdjRIBsTransaction trans, Peer peer, MpReachNlri nlri, PathAttributes attributes) { + return; + } + + @Override + public void removeRoutes(AdjRIBsTransaction trans, Peer peer, MpUnreachNlri nlri) { + return; + } + + @Override + public void addAdvertisement(MpReachNlriBuilder builder, Ipv4Route data) { + return; + } + + @Override + protected KeyedInstanceIdentifier identifierForKey( + InstanceIdentifier basePath, Ipv4Prefix id) { + return basePath.child(Ipv4Routes.class).child(Ipv4Route.class, + new Ipv4RouteKey(id)); + } + + @Override + protected void addWithdrawal(MpUnreachNlriBuilder builder, Ipv4Prefix id) { + return; + } + + @Override + public KeyedInstanceIdentifier routeIdentifier(InstanceIdentifier id) { + return null; + } + + @Override + public Ipv4Prefix keyForIdentifier(KeyedInstanceIdentifier id) { + return null; + } + } +} diff --git a/bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionTest.java b/bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionTest.java new file mode 100644 index 0000000000..39c5b9ce1f --- /dev/null +++ b/bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionTest.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2014 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.rib.spi; + +import com.google.common.collect.Lists; +import java.util.List; +import junit.framework.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; +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.yang.binding.KeyedInstanceIdentifier; + +public class SimpleRIBExtensionTest { + + @Test + public void testExtensionProvider() { + final ServiceLoaderRIBExtensionConsumerContext ctx = ServiceLoaderRIBExtensionConsumerContext.createConsumerContext(); + Assert.assertNull(ctx.getAdjRIBsInFactory(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); + final TestActivator act = new TestActivator(); + act.startRIBExtensionProvider(ctx); + Assert.assertNotNull(ctx.getAdjRIBsInFactory(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); + act.close(); + Assert.assertNull(ctx.getAdjRIBsInFactory(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); + ctx.close(); + } + + private final class TestActivator extends AbstractRIBExtensionProviderActivator { + @Override + protected List startRIBExtensionProviderImpl(final RIBExtensionProviderContext context) { + return Lists.newArrayList(context.registerAdjRIBsInFactory(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, new AdjRIBsFactory() { + @Override + public AdjRIBsIn createAdjRIBs(final KeyedInstanceIdentifier basePath) { + return Mockito.mock(AbstractAdjRIBs.class); + } + })); + } + } +} -- 2.36.6