2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.protocol.bgp.rib.impl;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.mockito.Matchers.any;
14 import com.google.common.base.Optional;
15 import com.google.common.base.Throwables;
16 import com.google.common.collect.Lists;
17 import com.google.common.util.concurrent.CheckedFuture;
18 import io.netty.channel.Channel;
19 import io.netty.channel.DefaultChannelPromise;
20 import io.netty.channel.EventLoop;
21 import java.math.BigInteger;
22 import java.net.InetSocketAddress;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.List;
30 import java.util.concurrent.ExecutionException;
31 import java.util.concurrent.Executor;
32 import java.util.concurrent.TimeUnit;
33 import javassist.ClassPool;
34 import org.junit.After;
35 import org.junit.Assert;
36 import org.junit.Before;
37 import org.junit.Ignore;
38 import org.junit.Test;
39 import org.mockito.Mock;
40 import org.mockito.Mockito;
41 import org.mockito.MockitoAnnotations;
42 import org.mockito.invocation.InvocationOnMock;
43 import org.mockito.stubbing.Answer;
44 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
45 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
46 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
47 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
48 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
49 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
50 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
51 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
52 import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension;
53 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener;
54 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
55 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier;
56 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
57 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
58 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
59 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
60 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsIn;
61 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
62 import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
63 import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.Ipv4Routes;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4Route;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4RouteBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4RouteKey;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.DomainIdentifier;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Identifier;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Ipv4InterfaceIdentifier;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ProtocolId;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.TopologyIdentifier;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.destination.CLinkstateDestination;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.LinkCaseBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.LinkDescriptorsBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.LocalNodeDescriptors;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.LocalNodeDescriptorsBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.RemoteNodeDescriptors;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.RemoteNodeDescriptorsBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.LinkstateRoutes;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.LinkstateRoute;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.LinkstateRouteBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.LinkstateRouteKey;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.IsisNodeCaseBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.OspfNodeCaseBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.isis.node._case.IsisNodeBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.ospf.node._case.OspfNodeBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.KeepaliveBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.OpenBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.UpdateBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParametersBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.OptionalCapabilitiesBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.NlriBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.WithdrawnRoutesBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes2;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes2Builder;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.MultiprotocolCaseBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.multiprotocol._case.MultiprotocolCapabilityBuilder;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlriBuilder;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRibId;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.LocRib;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.route.AttributesBuilder;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
121 import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTreeFactory;
122 import org.opendaylight.yangtools.binding.data.codec.gen.impl.DataObjectSerializerGenerator;
123 import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
124 import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
125 import org.opendaylight.yangtools.sal.binding.generator.api.ClassLoadingStrategy;
126 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
127 import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
128 import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
129 import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
130 import org.opendaylight.yangtools.yang.binding.DataObject;
131 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
132 import org.opendaylight.yangtools.yang.binding.Notification;
133 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
134 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
135 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
136 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
138 public class ApplicationPeerTest {
140 private final TablesKey tk = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
141 private final TablesKey lk = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
146 BGPDispatcher dispatcher;
149 ReconnectStrategyFactory tcpStrategyFactory;
158 WriteTransaction transWrite;
161 DOMDataWriteTransaction domTransWrite;
164 BindingTransactionChain chain;
167 DOMTransactionChain domChain;
169 BindingCodecTreeFactory codecFactory;
172 ApplicationPeer peer;
175 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
178 CheckedFuture<?,?> future;
184 DOMDataTreeChangeService service;
186 BGPSessionImpl session;
188 List<InstanceIdentifier<?>> routes;
190 private BGPPeer classic;
196 private EventLoop eventLoop;
198 private final byte[] linkNlri = new byte[] { 0, 2, 0, 0x65, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, (byte) 0x1a,
199 2, 0, 0, 4, 0, 0, 0, 0x48, 2, 1, 0, 4, 0x28, 0x28, 0x28, 0x28, 2, 3, 0, 6, 0, 0, 0, 0, 0, 0x42, 1, 1, 0, 0x18,
200 2, 0, 0, 4, 0, 0, 0, 0x48, 2, 1, 0, 4, 0x28, 0x28, 0x28, 0x28, 2, 3, 0, 4, 0, 0, 0, 0x40, 1, 2, 0, 8, 1, 2, 3,
201 4, 0x0a, 0x0b, 0x0c, 0x0d, 1, 3, 0, 4, (byte) 0xc5, 0x14, (byte) 0xa0, (byte) 0x2a, 1, 4, 0, 4, (byte) 0xc5,
202 0x14, (byte) 0xa0, 0x28, 1, 7, 0, 2, 0, 3};
204 private RIBActivator a1;
205 private org.opendaylight.protocol.bgp.linkstate.RIBActivator a2;
207 @SuppressWarnings("unchecked")
209 public void setUp() throws InterruptedException, ExecutionException, ReadFailedException {
210 MockitoAnnotations.initMocks(this);
211 final ModuleInfoBackedContext strategy = createClassLoadingStrategy();
212 final SchemaContext schemaContext = strategy.tryToCreateSchemaContext().get();
213 this.codecFactory = createCodecFactory(strategy,schemaContext);
214 final List<BgpTableType> localTables = new ArrayList<>();
215 this.routes = new ArrayList<>();
216 localTables.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
217 localTables.add(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class));
218 final RIBExtensionProviderContext context = new SimpleRIBExtensionProviderContext();
219 this.a1 = new RIBActivator();
220 this.a1.startRIBExtensionProvider(context);
221 this.a2 = new org.opendaylight.protocol.bgp.linkstate.RIBActivator();
222 this.a2.startRIBExtensionProvider(context);
223 Mockito.doReturn(this.chain).when(this.dps).createTransactionChain(Mockito.any(RIBImpl.class));
224 Mockito.doReturn(this.domChain).when(this.dom).createTransactionChain(Mockito.any(BGPPeer.class));
225 final Map<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension> map = new HashMap<>();
226 map.put(DOMDataTreeChangeService.class, this.service);
227 Mockito.doReturn(null).when(this.service).registerDataTreeChangeListener(Mockito.any(DOMDataTreeIdentifier.class), Mockito.any(DOMDataTreeChangeListener.class));
228 Mockito.doReturn(map).when(this.dom).getSupportedExtensions();
229 Mockito.doReturn(this.o).when(this.future).get();
230 Mockito.doNothing().when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Rib.class));
231 Mockito.doNothing().when(this.domTransWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
232 Mockito.doNothing().when(this.domTransWrite).merge(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
233 Mockito.doNothing().when(this.domTransWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class));
234 Mockito.doAnswer(new Answer<Object>() {
237 public Object answer(final InvocationOnMock invocation) throws Throwable {
238 final Object[] args = invocation.getArguments();
239 ApplicationPeerTest.this.routes.add((InstanceIdentifier<?>) args[1]);
242 }).when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Route.class), Mockito.eq(true));
243 Mockito.doNothing().when(this.transWrite).merge(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Attributes.class));
244 Mockito.doReturn(false).when(this.o).isPresent();
245 Mockito.doReturn(this.future).when(this.transWrite).submit();
246 Mockito.doReturn(this.future).when(this.domTransWrite).submit();
247 Mockito.doNothing().when(this.future).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
248 Mockito.doReturn(this.transWrite).when(this.chain).newWriteOnlyTransaction();
249 Mockito.doReturn(this.domTransWrite).when(this.domChain).newWriteOnlyTransaction();
250 Mockito.doReturn(this.eventLoop).when(this.channel).eventLoop();
251 Mockito.doReturn("channel").when(this.channel).toString();
252 Mockito.doAnswer(new Answer<Object>() {
255 public Object answer(final InvocationOnMock invocation) throws Throwable {
256 final Object[] args = invocation.getArguments();
257 ApplicationPeerTest.this.routes.remove(args[1]);
260 }).when(this.transWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class));
261 this.r = new RIBImpl(new RibId("test"), new AsNumber(5L), new Ipv4Address("127.0.0.1"),
262 new Ipv4Address("128.0.0.1"), context , this.dispatcher, this.tcpStrategyFactory, this.codecFactory, this.tcpStrategyFactory, this.dps, this.dom, localTables,GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy());
263 this.peer = new ApplicationPeer(new ApplicationRibId("t"), new Ipv4Address("127.0.0.1"), this.r);
264 this.r.onGlobalContextUpdated(schemaContext);
265 final ReadOnlyTransaction readTx = Mockito.mock(ReadOnlyTransaction.class);
266 Mockito.doReturn(readTx).when(this.dps).newReadOnlyTransaction();
267 final CheckedFuture<Optional<DataObject>, ReadFailedException> readFuture = Mockito.mock(CheckedFuture.class);
268 Mockito.doReturn(Optional.<DataObject>absent()).when(readFuture).checkedGet();
269 Mockito.doReturn(readFuture).when(readTx).read(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class));
272 private BindingCodecTreeFactory createCodecFactory(final ClassLoadingStrategy str, final SchemaContext ctx) {
273 final DataObjectSerializerGenerator generator = StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()));
274 final BindingNormalizedNodeCodecRegistry codec = new BindingNormalizedNodeCodecRegistry(generator);
275 codec.onBindingRuntimeContextUpdated(BindingRuntimeContext.create(str, ctx));
279 private ModuleInfoBackedContext createClassLoadingStrategy() {
280 final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
283 ctx.registerModuleInfo(BindingReflections.getModuleInfo(LinkstateRoute.class));
284 ctx.registerModuleInfo(BindingReflections.getModuleInfo(Ipv4Route.class));
285 } catch (final Exception e) {
286 throw Throwables.propagate(e);
292 public void tearDown() {
298 public void testOnDataChanged() {
299 final Map<InstanceIdentifier<?>, DataObject> created = new HashMap<>();
300 final AdjRIBsIn<Ipv4Prefix, Ipv4Route> a4 = this.r.getTable(this.tk);
303 InstanceIdentifier<?> iid = InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(new RibId("foo")))
304 .child(LocRib.class).child(Tables.class, this.tk)
305 .child((Class)Ipv4Routes.class).child(Ipv4Route.class, new Ipv4RouteKey(new Ipv4Prefix("127.0.0.1/32")));
306 created.put(iid, new Ipv4RouteBuilder().setPrefix(new Ipv4Prefix("127.0.0.1/32")).setAttributes(new AttributesBuilder().build()).build());
308 final Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
309 final AdjRIBsIn<CLinkstateDestination, LinkstateRoute> al = this.r.getTable(this.lk);
312 iid = InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(new RibId("foo")))
313 .child(LocRib.class).child(Tables.class, this.lk)
314 .child((Class)LinkstateRoutes.class).child(LinkstateRoute.class, new LinkstateRouteKey(this.linkNlri));
315 final LocalNodeDescriptors lnd = new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber(72L)).setDomainId(new DomainIdentifier(673720360L))
316 .setCRouterIdentifier(new IsisNodeCaseBuilder().setIsisNode(new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 0, 0, 0, 0, 0, 66 })).build()).build()).build();
317 final RemoteNodeDescriptors rnd = new RemoteNodeDescriptorsBuilder().setAsNumber(new AsNumber(72L)).setDomainId(new DomainIdentifier(673720360L))
318 .setCRouterIdentifier(new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(64L).build()).build()).build();
319 updated.put(iid, new LinkstateRouteBuilder().setProtocolId(ProtocolId.IsisLevel2).setIdentifier(new Identifier(BigInteger.ONE)).setObjectType(
320 new LinkCaseBuilder().setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("197.20.160.42")))
321 .setIpv4NeighborAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("197.20.160.40"))).setLinkLocalIdentifier(16909060L).setLinkRemoteIdentifier(168496141L).setMultiTopologyId(new TopologyIdentifier(3)).build())
322 .setLocalNodeDescriptors(lnd)
323 .setRemoteNodeDescriptors(rnd).build()).build());
325 final Set<InstanceIdentifier<?>> removed = new HashSet<>();
328 Mockito.doReturn(created).when(this.change).getCreatedData();
329 Mockito.doReturn(updated).when(this.change).getUpdatedData();
330 Mockito.doReturn(Collections.EMPTY_SET).when(this.change).getRemovedPaths();
331 this.peer.onDataChanged(this.change);
332 assertEquals(3, this.routes.size());
334 Mockito.doReturn(Collections.EMPTY_MAP).when(this.change).getCreatedData();
335 Mockito.doReturn(Collections.EMPTY_MAP).when(this.change).getUpdatedData();
336 Mockito.doReturn(removed).when(this.change).getRemovedPaths();
337 this.peer.onDataChanged(this.change);
338 assertEquals(2, this.routes.size());
341 /* This test relies on RIBImpl.updateTables to popuplate the loc RIB. Refactor it to use new RIB */
344 public void testClassicPeer() {
345 this.classic = new BGPPeer("testPeer", this.r);
346 Mockito.doReturn(null).when(this.eventLoop).schedule(any(Runnable.class), any(long.class), any(TimeUnit.class));
347 Mockito.doReturn(Boolean.TRUE).when(this.channel).isWritable();
348 Mockito.doReturn(null).when(this.channel).close();
349 Mockito.doReturn(new DefaultChannelPromise(this.channel)).when(this.channel).writeAndFlush(any(Notification.class));
351 Mockito.doReturn(new InetSocketAddress("localhost", 12345)).when(this.channel).remoteAddress();
352 Mockito.doReturn(new InetSocketAddress("localhost", 12345)).when(this.channel).localAddress();
353 final List<BgpParameters> params = Lists.newArrayList(new BgpParametersBuilder().setOptionalCapabilities(Lists.newArrayList(new OptionalCapabilitiesBuilder().setCParameters(new MultiprotocolCaseBuilder()
354 .setMultiprotocolCapability(new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build())).build());
355 this.session = new BGPSessionImpl(this.classic, this.channel, new OpenBuilder().setBgpIdentifier(new Ipv4Address("1.1.1.1")).setHoldTimer(50).setMyAsNumber(72).setBgpParameters(params).build(), 30, null);
356 assertEquals(this.r, this.classic.getRib());
357 assertEquals("testPeer", this.classic.getName());
358 Mockito.doAnswer(new Answer<Object>() {
361 public Object answer(final InvocationOnMock invocation) throws Throwable {
362 final Object[] args = invocation.getArguments();
363 ((SessionRIBsOut)args[0]).run();
366 }).when(this.eventLoop).submit(Mockito.any(Runnable.class));
367 this.classic.onSessionUp(this.session);
368 Assert.assertArrayEquals(new byte[] {1, 1, 1, 1}, this.classic.getRawIdentifier());
369 assertEquals("BGPPeer{name=testPeer, tables=[TablesKey [_afi=class org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily, _safi=class org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily]]}", this.classic.toString());
370 final List<Ipv4Prefix> prefs = Lists.newArrayList(new Ipv4Prefix("127.0.0.1/32"), new Ipv4Prefix("2.2.2.2/24"));
371 final UpdateBuilder ub = new UpdateBuilder();
372 ub.setNlri(new NlriBuilder().setNlri(prefs).build());
373 ub.setPathAttributes(new PathAttributesBuilder().build());
374 this.classic.onMessage(this.session, ub.build());
375 assertEquals(3, this.routes.size());
377 //create new peer so that it gets advertized routes from RIB
378 try (final BGPPeer testingPeer = new BGPPeer("testingPeer", this.r)) {
379 testingPeer.onSessionUp(this.session);
380 assertEquals(3, this.routes.size());
381 assertEquals(1, testingPeer.getBgpPeerState().getSessionEstablishedCount().intValue());
382 assertEquals(1, testingPeer.getBgpPeerState().getRouteTable().size());
383 assertNotNull(testingPeer.getBgpSessionState());
387 ub.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setWithdrawnRoutes(prefs).build());
388 this.classic.onMessage(this.session, ub.build());
389 assertEquals(3, this.routes.size());
390 this.classic.onMessage(this.session, new KeepaliveBuilder().build());
391 this.classic.onMessage(this.session, new UpdateBuilder().setPathAttributes(
392 new PathAttributesBuilder().addAugmentation(
393 PathAttributes2.class,
394 new PathAttributes2Builder().setMpUnreachNlri(
395 new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build()).build());
396 this.classic.releaseConnection();
400 public void testClose() {
401 final AdjRIBsIn<Ipv4Prefix, Ipv4Route> a4 = this.r.getTable(this.tk);