X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=bgp%2Frib-impl%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fbgp%2Frib%2Fimpl%2FAbstractRIBTestSetup.java;h=2dbf9d73c47f0a1cc678e24433d1aa792782848f;hb=61e4a03e5554241bcb21dce49abe3e089e6e0237;hp=40b829dfeffe1f80cb728debac8b864a39820b0d;hpb=ac35f5db1582e2319c88976ddaa56ec17397d4db;p=bgpcep.git diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java index 40b829dfef..2dbf9d73c4 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java @@ -14,55 +14,34 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import com.google.common.base.Optional; -import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.FluentFuture; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.EventListener; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.Executor; -import javassist.ClassPool; -import org.junit.After; import org.junit.Before; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain; -import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.controller.md.sal.dom.api.ClusteredDOMDataTreeChangeListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory; -import org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataObjectSerializerGenerator; -import org.opendaylight.mdsal.binding.dom.codec.gen.impl.StreamWriterGenerator; -import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; -import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; -import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; -import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; -import org.opendaylight.mdsal.binding.generator.util.JavassistUtils; -import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; +import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer; import org.opendaylight.mdsal.common.api.CommitInfo; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.dom.api.DOMDataBroker; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; +import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; +import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; +import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; +import org.opendaylight.mdsal.dom.api.DOMTransactionChain; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.protocol.bgp.inet.RIBActivator; import org.opendaylight.protocol.bgp.mode.impl.base.BasePathSelectionModeFactory; import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext; -import org.opendaylight.protocol.bgp.rib.spi.RIBSupport; import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; @@ -70,92 +49,54 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.BgpTableType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.BgpRib; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.RibId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.Rib; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.AddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.BgpId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv4AddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv6AddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.SubsequentAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.UnicastSubsequentAddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.BgpId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv6AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily; import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; 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.tree.DataTreeCandidate; -import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode; -import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType; +import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate; +import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidateNode; +import org.opendaylight.yangtools.yang.data.tree.api.ModificationType; public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest { - - static final Class IPV4_AFI = Ipv4AddressFamily.class; - private static final Class IPV6_AFI = Ipv6AddressFamily.class; - static final Class SAFI = UnicastSubsequentAddressFamily.class; - static final TablesKey KEY = new TablesKey(IPV4_AFI, SAFI); static final QName PREFIX_QNAME = QName.create(Ipv4Route.QNAME, "prefix").intern(); private static final BgpId RIB_ID = new BgpId("127.0.0.1"); + private RIBImpl rib; - private BindingCodecTreeFactory codecFactory; - private RIBActivator a1; - private RIBSupport ribSupport; + private final RIBActivator a1 = new RIBActivator(); @Mock private BGPDispatcher dispatcher; @Mock private DOMDataBroker dom; - @Mock - private BindingTransactionChain chain; - - @Mock - private WriteTransaction transWrite; - @Mock private DOMTransactionChain domChain; @Mock - private DOMDataWriteTransaction domTransWrite; + private DOMDataTreeWriteTransaction domTransWrite; @Mock private FluentFuture future; @Mock - private Optional o; - - @Mock - private DOMDataTreeChangeService service; + private DataTreeChangeExtension service; @Mock private ClusterSingletonServiceProvider clusterSingletonServiceProvider; - private static ModuleInfoBackedContext createClassLoadingStrategy() { - final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create(); - try { - ctx.registerModuleInfo(BindingReflections.getModuleInfo(Ipv4Route.class)); - } catch (final RuntimeException e) { - throw e; - } catch (final Exception e) { - throw new RuntimeException(e); - } - return ctx; - } - - private static BindingCodecTreeFactory createCodecFactory(final ClassLoadingStrategy str, final SchemaContext ctx) { - final DataObjectSerializerGenerator generator = StreamWriterGenerator - .create(JavassistUtils.forClassPool(ClassPool.getDefault())); - final BindingNormalizedNodeCodecRegistry codec = new BindingNormalizedNodeCodecRegistry(generator); - codec.onBindingRuntimeContextUpdated(BindingRuntimeContext.create(str, ctx)); - return codec; - } @Override @Before @@ -166,81 +107,59 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest { public void mockRib() throws Exception { final RIBExtensionProviderContext context = new SimpleRIBExtensionProviderContext(); - final ModuleInfoBackedContext strategy = createClassLoadingStrategy(); - final SchemaContext schemaContext = strategy.tryToCreateSchemaContext().get(); - this.codecFactory = createCodecFactory(strategy, schemaContext); final List localTables = new ArrayList<>(); - localTables.add(new BgpTableTypeImpl(IPV4_AFI, SAFI)); - localTables.add(new BgpTableTypeImpl(IPV6_AFI, SAFI)); + localTables.add(new BgpTableTypeImpl(Ipv4AddressFamily.VALUE, UnicastSubsequentAddressFamily.VALUE)); + localTables.add(new BgpTableTypeImpl(Ipv6AddressFamily.VALUE, UnicastSubsequentAddressFamily.VALUE)); - this.a1 = new RIBActivator(); - this.a1.startRIBExtensionProvider(context, this.mappingService); - - final CodecsRegistryImpl codecsRegistry = CodecsRegistryImpl.create(this.codecFactory, - GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy()); + final CurrentAdapterSerializer serializer = mappingService.currentSerializer(); + a1.startRIBExtensionProvider(context, serializer); mockedMethods(); - doReturn(mock(ClusterSingletonServiceRegistration.class)).when(this.clusterSingletonServiceProvider) + doReturn(mock(Registration.class)).when(clusterSingletonServiceProvider) .registerClusterSingletonService(any(ClusterSingletonService.class)); - this.rib = new RIBImpl(this.tableRegistry, new RibId("test"), new AsNumber(5L), RIB_ID, context, - this.dispatcher, codecsRegistry, this.dom, getDataBroker(), this.policies, - localTables, Collections.singletonMap(KEY, + rib = new RIBImpl(tableRegistry, new RibId("test"), new AsNumber(Uint32.valueOf(5)), RIB_ID, context, + dispatcher, new ConstantCodecsRegistry(serializer), dom, policies, localTables, + Map.of(new TablesKey(Ipv4AddressFamily.VALUE, UnicastSubsequentAddressFamily.VALUE), BasePathSelectionModeFactory.createBestPathSelectionStrategy())); - this.rib.onGlobalContextUpdated(schemaContext); - this.ribSupport = getRib().getRibSupportContext().getRIBSupport(KEY); } - @SuppressWarnings("unchecked") private void mockedMethods() throws Exception { MockitoAnnotations.initMocks(this); - final ReadOnlyTransaction readTx = mock(ReadOnlyTransaction.class); - doReturn(new listenerRegistration()).when(this.service) - .registerDataTreeChangeListener(any(DOMDataTreeIdentifier.class), - any(ClusteredDOMDataTreeChangeListener.class)); - final Map, DOMDataBrokerExtension> map = new HashMap<>(); - map.put(DOMDataTreeChangeService.class, this.service); - doNothing().when(readTx).close(); - final CheckedFuture, ReadFailedException> readFuture = mock(CheckedFuture.class); - doNothing().when(this.domTransWrite).put(eq(LogicalDatastoreType.OPERATIONAL), + doReturn(new TestListenerRegistration()).when(service) + .registerTreeChangeListener(any(DOMDataTreeIdentifier.class), any(DOMDataTreeChangeListener.class)); + doNothing().when(domTransWrite).put(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class), any(NormalizedNode.class)); - doNothing().when(this.domTransWrite).delete(eq(LogicalDatastoreType.OPERATIONAL), + doNothing().when(domTransWrite).delete(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class)); - doNothing().when(this.domTransWrite).merge(eq(LogicalDatastoreType.OPERATIONAL), + doNothing().when(domTransWrite).merge(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class), any(NormalizedNode.class)); - doReturn(Optional.absent()).when(readFuture).checkedGet(); - doReturn(readFuture).when(readTx).read(eq(LogicalDatastoreType.OPERATIONAL), any(InstanceIdentifier.class)); - doNothing().when(this.domChain).close(); - doReturn(this.domTransWrite).when(this.domChain).newWriteOnlyTransaction(); + doNothing().when(domChain).close(); + doReturn(domTransWrite).when(domChain).newWriteOnlyTransaction(); doNothing().when(getTransaction()).put(eq(LogicalDatastoreType.OPERATIONAL), eq(YangInstanceIdentifier.of(BgpRib.QNAME)), any(NormalizedNode.class)); - doReturn(map).when(this.dom).getSupportedExtensions(); - doReturn(this.domChain).when(this.dom).createTransactionChain(any(AbstractPeer.class)); - doReturn(this.transWrite).when(this.chain).newWriteOnlyTransaction(); - doReturn(false).when(this.o).isPresent(); - doReturn(this.o).when(this.future).get(); - doReturn(this.future).when(this.domTransWrite).commit(); - doNothing().when(this.future).addListener(any(Runnable.class), any(Executor.class)); - doNothing().when(this.transWrite).put(eq(LogicalDatastoreType.OPERATIONAL), - any(InstanceIdentifier.class), any(DataObject.class), eq(true)); - doNothing().when(this.transWrite).put(eq(LogicalDatastoreType.OPERATIONAL), - any(InstanceIdentifier.class), any(DataObject.class)); - doReturn(this.future).when(this.transWrite).commit(); + doReturn(service).when(dom).extension(DataTreeChangeExtension.class); + doReturn(domChain).when(dom).createMergingTransactionChain(); + doNothing().when(domChain).addCallback(any()); + doReturn(Optional.empty()).when(future).get(); + doReturn(future).when(domTransWrite).commit(); + doCallRealMethod().when(future).addCallback(any(), any()); + doNothing().when(future).addListener(any(Runnable.class), any(Executor.class)); } - public Collection ipv4Input(final YangInstanceIdentifier target, + public List ipv4Input(final YangInstanceIdentifier target, final ModificationType type, final Ipv4Prefix... prefix) { - final Collection col = new HashSet<>(); + final List col = new ArrayList<>(); final DataTreeCandidate candidate = mock(DataTreeCandidate.class); final DataTreeCandidateNode rootNode = mock(DataTreeCandidateNode.class); doReturn(rootNode).when(candidate).getRootNode(); - doReturn(type).when(rootNode).getModificationType(); + doReturn(type).when(rootNode).modificationType(); doCallRealMethod().when(rootNode).toString(); doReturn(target).when(candidate).getRootPath(); doCallRealMethod().when(candidate).toString(); final Collection children = new HashSet<>(); for (final Ipv4Prefix p : prefix) { final NodeIdentifierWithPredicates routekey = - new NodeIdentifierWithPredicates(Ipv4Route.QNAME, PREFIX_QNAME, p); + NodeIdentifierWithPredicates.of(Ipv4Route.QNAME, PREFIX_QNAME, p); final DataContainerNodeBuilder b = ImmutableNodes.mapEntryBuilder(); b.withNodeIdentifier(routekey); @@ -248,37 +167,31 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest { .withNodeIdentifier(new NodeIdentifier(PREFIX_QNAME)).withValue(p).build()); final DataTreeCandidateNode child = mock(DataTreeCandidateNode.class); - doReturn(createIdentifier(p)).when(child).getIdentifier(); - doReturn(java.util.Optional.of(b.build())).when(child).getDataAfter(); - doReturn(type).when(child).getModificationType(); + doReturn(createIdentifier(p)).when(child).name(); + doReturn(b.build()).when(child).dataAfter(); + doReturn(type).when(child).modificationType(); children.add(child); } - doReturn(children).when(rootNode).getChildNodes(); + doReturn(children).when(rootNode).childNodes(); col.add(candidate); return col; } public PathArgument createIdentifier(final Ipv4Prefix prefix) { final NodeIdentifierWithPredicates routekey = - new NodeIdentifierWithPredicates(Ipv4Route.QNAME, PREFIX_QNAME, prefix); + NodeIdentifierWithPredicates.of(Ipv4Route.QNAME, PREFIX_QNAME, prefix); return YangInstanceIdentifier.of(PREFIX_QNAME).node(routekey).getLastPathArgument(); } public RIBImpl getRib() { - return this.rib; - } - - public DOMDataWriteTransaction getTransaction() { - return this.domTransWrite; + return rib; } - @Override - @After - public void tearDown() { - this.a1.close(); + public DOMDataTreeWriteTransaction getTransaction() { + return domTransWrite; } - private class listenerRegistration implements ListenerRegistration { + private static final class TestListenerRegistration implements ListenerRegistration { @Override public EventListener getInstance() { return null;