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.path.attributes.AttributesBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.NlriBuilder;
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.Attributes2;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2Builder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
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.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.types.rev130919.Ipv4AddressFamily;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
120 import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTreeFactory;
121 import org.opendaylight.yangtools.binding.data.codec.gen.impl.DataObjectSerializerGenerator;
122 import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
123 import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
124 import org.opendaylight.yangtools.sal.binding.generator.api.ClassLoadingStrategy;
125 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
126 import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
127 import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
128 import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
129 import org.opendaylight.yangtools.yang.binding.DataObject;
130 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
131 import org.opendaylight.yangtools.yang.binding.Notification;
132 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
133 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
134 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
135 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
137 public class ApplicationPeerTest {
139 private final TablesKey tk = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
140 private final TablesKey lk = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
145 BGPDispatcher dispatcher;
148 ReconnectStrategyFactory tcpStrategyFactory;
157 WriteTransaction transWrite;
160 DOMDataWriteTransaction domTransWrite;
163 BindingTransactionChain chain;
166 DOMTransactionChain domChain;
168 BindingCodecTreeFactory codecFactory;
171 ApplicationPeer peer;
174 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
177 CheckedFuture<?,?> future;
183 DOMDataTreeChangeService service;
185 BGPSessionImpl session;
187 List<InstanceIdentifier<?>> routes;
189 private BGPPeer classic;
195 private EventLoop eventLoop;
197 private final byte[] linkNlri = new byte[] { 0, 2, 0, 0x65, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, (byte) 0x1a,
198 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,
199 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,
200 4, 0x0a, 0x0b, 0x0c, 0x0d, 1, 3, 0, 4, (byte) 0xc5, 0x14, (byte) 0xa0, (byte) 0x2a, 1, 4, 0, 4, (byte) 0xc5,
201 0x14, (byte) 0xa0, 0x28, 1, 7, 0, 2, 0, 3};
203 private RIBActivator a1;
204 private org.opendaylight.protocol.bgp.linkstate.RIBActivator a2;
206 @SuppressWarnings("unchecked")
208 public void setUp() throws InterruptedException, ExecutionException, ReadFailedException {
209 MockitoAnnotations.initMocks(this);
210 final ModuleInfoBackedContext strategy = createClassLoadingStrategy();
211 final SchemaContext schemaContext = strategy.tryToCreateSchemaContext().get();
212 this.codecFactory = createCodecFactory(strategy,schemaContext);
213 final List<BgpTableType> localTables = new ArrayList<>();
214 this.routes = new ArrayList<>();
215 localTables.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
216 localTables.add(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class));
217 final RIBExtensionProviderContext context = new SimpleRIBExtensionProviderContext();
218 this.a1 = new RIBActivator();
219 this.a1.startRIBExtensionProvider(context);
220 this.a2 = new org.opendaylight.protocol.bgp.linkstate.RIBActivator();
221 this.a2.startRIBExtensionProvider(context);
222 Mockito.doReturn(this.chain).when(this.dps).createTransactionChain(Mockito.any(RIBImpl.class));
223 Mockito.doReturn(this.domChain).when(this.dom).createTransactionChain(Mockito.any(BGPPeer.class));
224 final Map<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension> map = new HashMap<>();
225 map.put(DOMDataTreeChangeService.class, this.service);
226 Mockito.doReturn(null).when(this.service).registerDataTreeChangeListener(Mockito.any(DOMDataTreeIdentifier.class), Mockito.any(DOMDataTreeChangeListener.class));
227 Mockito.doReturn(map).when(this.dom).getSupportedExtensions();
228 Mockito.doReturn(this.o).when(this.future).get();
229 Mockito.doNothing().when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Rib.class));
230 Mockito.doNothing().when(this.domTransWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
231 Mockito.doNothing().when(this.domTransWrite).merge(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
232 Mockito.doNothing().when(this.domTransWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class));
233 Mockito.doAnswer(new Answer<Object>() {
236 public Object answer(final InvocationOnMock invocation) throws Throwable {
237 final Object[] args = invocation.getArguments();
238 ApplicationPeerTest.this.routes.add((InstanceIdentifier<?>) args[1]);
241 }).when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Route.class), Mockito.eq(true));
242 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));
243 Mockito.doReturn(false).when(this.o).isPresent();
244 Mockito.doReturn(this.future).when(this.transWrite).submit();
245 Mockito.doReturn(this.future).when(this.domTransWrite).submit();
246 Mockito.doNothing().when(this.future).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
247 Mockito.doReturn(this.transWrite).when(this.chain).newWriteOnlyTransaction();
248 Mockito.doReturn(this.domTransWrite).when(this.domChain).newWriteOnlyTransaction();
249 Mockito.doReturn(this.eventLoop).when(this.channel).eventLoop();
250 Mockito.doReturn("channel").when(this.channel).toString();
251 Mockito.doAnswer(new Answer<Object>() {
254 public Object answer(final InvocationOnMock invocation) throws Throwable {
255 final Object[] args = invocation.getArguments();
256 ApplicationPeerTest.this.routes.remove(args[1]);
259 }).when(this.transWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class));
260 this.r = new RIBImpl(new RibId("test"), new AsNumber(5L), new Ipv4Address("127.0.0.1"),
261 new Ipv4Address("128.0.0.1"), context , this.dispatcher, this.tcpStrategyFactory, this.codecFactory, this.tcpStrategyFactory, this.dps, this.dom, localTables,GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy());
262 this.peer = new ApplicationPeer(new ApplicationRibId("t"), new Ipv4Address("127.0.0.1"), this.r);
263 this.r.onGlobalContextUpdated(schemaContext);
264 final ReadOnlyTransaction readTx = Mockito.mock(ReadOnlyTransaction.class);
265 Mockito.doReturn(readTx).when(this.dps).newReadOnlyTransaction();
266 final CheckedFuture<Optional<DataObject>, ReadFailedException> readFuture = Mockito.mock(CheckedFuture.class);
267 Mockito.doReturn(Optional.<DataObject>absent()).when(readFuture).checkedGet();
268 Mockito.doReturn(readFuture).when(readTx).read(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class));
271 private BindingCodecTreeFactory createCodecFactory(final ClassLoadingStrategy str, final SchemaContext ctx) {
272 final DataObjectSerializerGenerator generator = StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()));
273 final BindingNormalizedNodeCodecRegistry codec = new BindingNormalizedNodeCodecRegistry(generator);
274 codec.onBindingRuntimeContextUpdated(BindingRuntimeContext.create(str, ctx));
278 private ModuleInfoBackedContext createClassLoadingStrategy() {
279 final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
282 ctx.registerModuleInfo(BindingReflections.getModuleInfo(LinkstateRoute.class));
283 ctx.registerModuleInfo(BindingReflections.getModuleInfo(Ipv4Route.class));
284 } catch (final Exception e) {
285 throw Throwables.propagate(e);
291 public void tearDown() {
297 public void testOnDataChanged() {
298 final Map<InstanceIdentifier<?>, DataObject> created = new HashMap<>();
299 final AdjRIBsIn<Ipv4Prefix, Ipv4Route> a4 = this.r.getTable(this.tk);
302 InstanceIdentifier<?> iid = InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(new RibId("foo")))
303 .child(LocRib.class).child(Tables.class, this.tk)
304 .child((Class)Ipv4Routes.class).child(Ipv4Route.class, new Ipv4RouteKey(new Ipv4Prefix("127.0.0.1/32")));
305 created.put(iid, new Ipv4RouteBuilder().setPrefix(new Ipv4Prefix("127.0.0.1/32")).setAttributes(new AttributesBuilder().build()).build());
307 final Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
308 final AdjRIBsIn<CLinkstateDestination, LinkstateRoute> al = this.r.getTable(this.lk);
311 iid = InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(new RibId("foo")))
312 .child(LocRib.class).child(Tables.class, this.lk)
313 .child((Class)LinkstateRoutes.class).child(LinkstateRoute.class, new LinkstateRouteKey(this.linkNlri));
314 final LocalNodeDescriptors lnd = new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber(72L)).setDomainId(new DomainIdentifier(673720360L))
315 .setCRouterIdentifier(new IsisNodeCaseBuilder().setIsisNode(new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 0, 0, 0, 0, 0, 66 })).build()).build()).build();
316 final RemoteNodeDescriptors rnd = new RemoteNodeDescriptorsBuilder().setAsNumber(new AsNumber(72L)).setDomainId(new DomainIdentifier(673720360L))
317 .setCRouterIdentifier(new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(64L).build()).build()).build();
318 updated.put(iid, new LinkstateRouteBuilder().setProtocolId(ProtocolId.IsisLevel2).setIdentifier(new Identifier(BigInteger.ONE)).setObjectType(
319 new LinkCaseBuilder().setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("197.20.160.42")))
320 .setIpv4NeighborAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("197.20.160.40"))).setLinkLocalIdentifier(16909060L).setLinkRemoteIdentifier(168496141L).setMultiTopologyId(new TopologyIdentifier(3)).build())
321 .setLocalNodeDescriptors(lnd)
322 .setRemoteNodeDescriptors(rnd).build()).build());
324 final Set<InstanceIdentifier<?>> removed = new HashSet<>();
327 Mockito.doReturn(created).when(this.change).getCreatedData();
328 Mockito.doReturn(updated).when(this.change).getUpdatedData();
329 Mockito.doReturn(Collections.EMPTY_SET).when(this.change).getRemovedPaths();
330 this.peer.onDataChanged(this.change);
331 assertEquals(3, this.routes.size());
333 Mockito.doReturn(Collections.EMPTY_MAP).when(this.change).getCreatedData();
334 Mockito.doReturn(Collections.EMPTY_MAP).when(this.change).getUpdatedData();
335 Mockito.doReturn(removed).when(this.change).getRemovedPaths();
336 this.peer.onDataChanged(this.change);
337 assertEquals(2, this.routes.size());
340 /* This test relies on RIBImpl.updateTables to popuplate the loc RIB. Refactor it to use new RIB */
343 public void testClassicPeer() {
344 this.classic = new BGPPeer("testPeer", this.r);
345 Mockito.doReturn(null).when(this.eventLoop).schedule(any(Runnable.class), any(long.class), any(TimeUnit.class));
346 Mockito.doReturn(Boolean.TRUE).when(this.channel).isWritable();
347 Mockito.doReturn(null).when(this.channel).close();
348 Mockito.doReturn(new DefaultChannelPromise(this.channel)).when(this.channel).writeAndFlush(any(Notification.class));
350 Mockito.doReturn(new InetSocketAddress("localhost", 12345)).when(this.channel).remoteAddress();
351 Mockito.doReturn(new InetSocketAddress("localhost", 12345)).when(this.channel).localAddress();
352 final List<BgpParameters> params = Lists.newArrayList(new BgpParametersBuilder().setOptionalCapabilities(Lists.newArrayList(new OptionalCapabilitiesBuilder().setCParameters(new MultiprotocolCaseBuilder()
353 .setMultiprotocolCapability(new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build())).build());
354 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);
355 assertEquals(this.r, this.classic.getRib());
356 assertEquals("testPeer", this.classic.getName());
357 Mockito.doAnswer(new Answer<Object>() {
360 public Object answer(final InvocationOnMock invocation) throws Throwable {
361 final Object[] args = invocation.getArguments();
362 ((SessionRIBsOut)args[0]).run();
365 }).when(this.eventLoop).submit(Mockito.any(Runnable.class));
366 this.classic.onSessionUp(this.session);
367 Assert.assertArrayEquals(new byte[] {1, 1, 1, 1}, this.classic.getRawIdentifier());
368 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());
369 final List<Ipv4Prefix> prefs = Lists.newArrayList(new Ipv4Prefix("127.0.0.1/32"), new Ipv4Prefix("2.2.2.2/24"));
370 final UpdateBuilder ub = new UpdateBuilder();
371 ub.setNlri(new NlriBuilder().setNlri(prefs).build());
372 ub.setAttributes(new AttributesBuilder().build());
373 this.classic.onMessage(this.session, ub.build());
374 assertEquals(3, this.routes.size());
376 //create new peer so that it gets advertized routes from RIB
377 try (final BGPPeer testingPeer = new BGPPeer("testingPeer", this.r)) {
378 testingPeer.onSessionUp(this.session);
379 assertEquals(3, this.routes.size());
380 assertEquals(1, testingPeer.getBgpPeerState().getSessionEstablishedCount().intValue());
381 assertEquals(1, testingPeer.getBgpPeerState().getRouteTable().size());
382 assertNotNull(testingPeer.getBgpSessionState());
386 ub.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setWithdrawnRoutes(prefs).build());
387 this.classic.onMessage(this.session, ub.build());
388 assertEquals(3, this.routes.size());
389 this.classic.onMessage(this.session, new KeepaliveBuilder().build());
390 this.classic.onMessage(this.session, new UpdateBuilder().setAttributes(
391 new AttributesBuilder().addAugmentation(
393 new Attributes2Builder().setMpUnreachNlri(
394 new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build()).build());
395 this.classic.releaseConnection();
399 public void testClose() {
400 final AdjRIBsIn<Ipv4Prefix, Ipv4Route> a4 = this.r.getTable(this.tk);