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.ChannelHandler;
20 import io.netty.channel.ChannelPipeline;
21 import io.netty.channel.DefaultChannelPromise;
22 import io.netty.channel.EventLoop;
23 import java.math.BigInteger;
24 import java.net.InetSocketAddress;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.HashMap;
28 import java.util.HashSet;
29 import java.util.List;
32 import java.util.concurrent.ExecutionException;
33 import java.util.concurrent.Executor;
34 import java.util.concurrent.TimeUnit;
35 import javassist.ClassPool;
36 import org.junit.After;
37 import org.junit.Assert;
38 import org.junit.Before;
39 import org.junit.Ignore;
40 import org.junit.Test;
41 import org.mockito.Mock;
42 import org.mockito.Mockito;
43 import org.mockito.MockitoAnnotations;
44 import org.mockito.invocation.InvocationOnMock;
45 import org.mockito.stubbing.Answer;
46 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
47 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
48 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
49 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
50 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
51 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
52 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
53 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
54 import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension;
55 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener;
56 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
57 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier;
58 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
59 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
60 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
61 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
62 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
63 import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
64 import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.Ipv4Routes;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4Route;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4RouteBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4RouteKey;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.DomainIdentifier;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Identifier;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Ipv4InterfaceIdentifier;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ProtocolId;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.TopologyIdentifier;
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 ChannelPipeline pipeline;
198 private EventLoop eventLoop;
200 private final byte[] linkNlri = new byte[] { 0, 2, 0, 0x65, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, (byte) 0x1a,
201 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,
202 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,
203 4, 0x0a, 0x0b, 0x0c, 0x0d, 1, 3, 0, 4, (byte) 0xc5, 0x14, (byte) 0xa0, (byte) 0x2a, 1, 4, 0, 4, (byte) 0xc5,
204 0x14, (byte) 0xa0, 0x28, 1, 7, 0, 2, 0, 3};
206 private RIBActivator a1;
207 private org.opendaylight.protocol.bgp.linkstate.RIBActivator a2;
209 @SuppressWarnings("unchecked")
211 public void setUp() throws InterruptedException, ExecutionException, ReadFailedException {
212 MockitoAnnotations.initMocks(this);
213 final ModuleInfoBackedContext strategy = createClassLoadingStrategy();
214 final SchemaContext schemaContext = strategy.tryToCreateSchemaContext().get();
215 this.codecFactory = createCodecFactory(strategy,schemaContext);
216 final List<BgpTableType> localTables = new ArrayList<>();
217 this.routes = new ArrayList<>();
218 localTables.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
219 localTables.add(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class));
220 final RIBExtensionProviderContext context = new SimpleRIBExtensionProviderContext();
221 this.a1 = new RIBActivator();
222 this.a1.startRIBExtensionProvider(context);
223 this.a2 = new org.opendaylight.protocol.bgp.linkstate.RIBActivator();
224 this.a2.startRIBExtensionProvider(context);
225 Mockito.doReturn(this.chain).when(this.dps).createTransactionChain(Mockito.any(RIBImpl.class));
226 Mockito.doReturn(this.domChain).when(this.dom).createTransactionChain(Mockito.any(BGPPeer.class));
227 final Map<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension> map = new HashMap<>();
228 map.put(DOMDataTreeChangeService.class, this.service);
229 Mockito.doReturn(null).when(this.service).registerDataTreeChangeListener(Mockito.any(DOMDataTreeIdentifier.class), Mockito.any(DOMDataTreeChangeListener.class));
230 Mockito.doReturn(map).when(this.dom).getSupportedExtensions();
231 Mockito.doReturn(this.o).when(this.future).get();
232 Mockito.doNothing().when(this.domChain).close();
233 Mockito.doNothing().when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Rib.class));
234 Mockito.doNothing().when(this.domTransWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
235 Mockito.doNothing().when(this.domTransWrite).merge(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
236 Mockito.doNothing().when(this.domTransWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class));
237 Mockito.doAnswer(new Answer<Object>() {
240 public Object answer(final InvocationOnMock invocation) throws Throwable {
241 final Object[] args = invocation.getArguments();
242 ApplicationPeerTest.this.routes.add((InstanceIdentifier<?>) args[1]);
245 }).when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Route.class), Mockito.eq(true));
246 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));
247 Mockito.doReturn(false).when(this.o).isPresent();
248 Mockito.doReturn(this.future).when(this.transWrite).submit();
249 Mockito.doReturn(this.future).when(this.domTransWrite).submit();
250 Mockito.doNothing().when(this.future).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
251 Mockito.doReturn(this.transWrite).when(this.chain).newWriteOnlyTransaction();
252 Mockito.doReturn(this.domTransWrite).when(this.domChain).newWriteOnlyTransaction();
253 Mockito.doReturn(this.eventLoop).when(this.channel).eventLoop();
254 Mockito.doReturn("channel").when(this.channel).toString();
255 Mockito.doReturn(this.pipeline).when(this.channel).pipeline();
256 Mockito.doReturn(this.pipeline).when(this.pipeline).addLast(Mockito.any(ChannelHandler.class));
257 Mockito.doAnswer(new Answer<Object>() {
260 public Object answer(final InvocationOnMock invocation) throws Throwable {
261 final Object[] args = invocation.getArguments();
262 ApplicationPeerTest.this.routes.remove(args[1]);
265 }).when(this.transWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class));
266 this.r = new RIBImpl(new RibId("test"), new AsNumber(5L), new Ipv4Address("127.0.0.1"),
267 new Ipv4Address("128.0.0.1"), context , this.dispatcher, this.tcpStrategyFactory, this.codecFactory, this.tcpStrategyFactory, this.dps, this.dom, localTables,GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy());
268 this.peer = new ApplicationPeer(new ApplicationRibId("t"), new Ipv4Address("127.0.0.1"), this.r);
269 this.r.onGlobalContextUpdated(schemaContext);
270 final ReadOnlyTransaction readTx = Mockito.mock(ReadOnlyTransaction.class);
271 Mockito.doReturn(readTx).when(this.dps).newReadOnlyTransaction();
272 final CheckedFuture<Optional<DataObject>, ReadFailedException> readFuture = Mockito.mock(CheckedFuture.class);
273 Mockito.doReturn(Optional.<DataObject>absent()).when(readFuture).checkedGet();
274 Mockito.doReturn(readFuture).when(readTx).read(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class));
277 private BindingCodecTreeFactory createCodecFactory(final ClassLoadingStrategy str, final SchemaContext ctx) {
278 final DataObjectSerializerGenerator generator = StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()));
279 final BindingNormalizedNodeCodecRegistry codec = new BindingNormalizedNodeCodecRegistry(generator);
280 codec.onBindingRuntimeContextUpdated(BindingRuntimeContext.create(str, ctx));
284 private ModuleInfoBackedContext createClassLoadingStrategy() {
285 final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
288 ctx.registerModuleInfo(BindingReflections.getModuleInfo(LinkstateRoute.class));
289 ctx.registerModuleInfo(BindingReflections.getModuleInfo(Ipv4Route.class));
290 } catch (final Exception e) {
291 throw Throwables.propagate(e);
297 public void tearDown() {
304 public void testOnDataChanged() {
305 final Map<InstanceIdentifier<?>, DataObject> created = new HashMap<>();
307 InstanceIdentifier<?> iid = InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(new RibId("foo")))
308 .child(LocRib.class).child(Tables.class, this.tk)
309 .child((Class)Ipv4Routes.class).child(Ipv4Route.class, new Ipv4RouteKey(new Ipv4Prefix("127.0.0.1/32")));
310 created.put(iid, new Ipv4RouteBuilder().setPrefix(new Ipv4Prefix("127.0.0.1/32")).setAttributes(new AttributesBuilder().build()).build());
312 final Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
314 iid = InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(new RibId("foo")))
315 .child(LocRib.class).child(Tables.class, this.lk)
316 .child((Class)LinkstateRoutes.class).child(LinkstateRoute.class, new LinkstateRouteKey(this.linkNlri));
317 final LocalNodeDescriptors lnd = new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber(72L)).setDomainId(new DomainIdentifier(673720360L))
318 .setCRouterIdentifier(new IsisNodeCaseBuilder().setIsisNode(new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 0, 0, 0, 0, 0, 66 })).build()).build()).build();
319 final RemoteNodeDescriptors rnd = new RemoteNodeDescriptorsBuilder().setAsNumber(new AsNumber(72L)).setDomainId(new DomainIdentifier(673720360L))
320 .setCRouterIdentifier(new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(64L).build()).build()).build();
321 updated.put(iid, new LinkstateRouteBuilder().setProtocolId(ProtocolId.IsisLevel2).setIdentifier(new Identifier(BigInteger.ONE)).setObjectType(
322 new LinkCaseBuilder().setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("197.20.160.42")))
323 .setIpv4NeighborAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("197.20.160.40"))).setLinkLocalIdentifier(16909060L).setLinkRemoteIdentifier(168496141L).setMultiTopologyId(new TopologyIdentifier(3)).build())
324 .setLocalNodeDescriptors(lnd)
325 .setRemoteNodeDescriptors(rnd).build()).build());
327 final Set<InstanceIdentifier<?>> removed = new HashSet<>();
330 Mockito.doReturn(created).when(this.change).getCreatedData();
331 Mockito.doReturn(updated).when(this.change).getUpdatedData();
332 Mockito.doReturn(Collections.EMPTY_SET).when(this.change).getRemovedPaths();
333 //this.peer.onDataChanged(this.change);
334 assertEquals(3, this.routes.size());
336 Mockito.doReturn(Collections.EMPTY_MAP).when(this.change).getCreatedData();
337 Mockito.doReturn(Collections.EMPTY_MAP).when(this.change).getUpdatedData();
338 Mockito.doReturn(removed).when(this.change).getRemovedPaths();
339 //this.peer.onDataChanged(this.change);
340 assertEquals(2, this.routes.size());
343 /* This test relies on RIBImpl.updateTables to popuplate the loc RIB. Refactor it to use new RIB */
346 public void testClassicPeer() {
347 this.classic = new BGPPeer("testPeer", this.r);
348 Mockito.doReturn(null).when(this.eventLoop).schedule(any(Runnable.class), any(long.class), any(TimeUnit.class));
349 Mockito.doReturn(Boolean.TRUE).when(this.channel).isWritable();
350 Mockito.doReturn(null).when(this.channel).close();
351 Mockito.doReturn(new DefaultChannelPromise(this.channel)).when(this.channel).writeAndFlush(any(Notification.class));
353 Mockito.doReturn(new InetSocketAddress("localhost", 12345)).when(this.channel).remoteAddress();
354 Mockito.doReturn(new InetSocketAddress("localhost", 12345)).when(this.channel).localAddress();
355 final List<BgpParameters> params = Lists.newArrayList(new BgpParametersBuilder().setOptionalCapabilities(Lists.newArrayList(new OptionalCapabilitiesBuilder().setCParameters(new MultiprotocolCaseBuilder()
356 .setMultiprotocolCapability(new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build())).build());
357 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);
358 assertEquals(this.r, this.classic.getRib());
359 assertEquals("testPeer", this.classic.getName());
360 Mockito.doAnswer(new Answer<Object>() {
363 public Object answer(final InvocationOnMock invocation) throws Throwable {
364 final Object[] args = invocation.getArguments();
365 ((SessionRIBsOut)args[0]).run();
368 }).when(this.eventLoop).submit(Mockito.any(Runnable.class));
369 this.classic.onSessionUp(this.session);
370 Assert.assertArrayEquals(new byte[] {1, 1, 1, 1}, this.classic.getRawIdentifier());
371 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());
372 final List<Ipv4Prefix> prefs = Lists.newArrayList(new Ipv4Prefix("127.0.0.1/32"), new Ipv4Prefix("2.2.2.2/24"));
373 final UpdateBuilder ub = new UpdateBuilder();
374 ub.setNlri(new NlriBuilder().setNlri(prefs).build());
375 ub.setAttributes(new AttributesBuilder().build());
376 this.classic.onMessage(this.session, ub.build());
377 assertEquals(3, this.routes.size());
379 //create new peer so that it gets advertized routes from RIB
380 try (final BGPPeer testingPeer = new BGPPeer("testingPeer", this.r)) {
381 testingPeer.onSessionUp(this.session);
382 assertEquals(3, this.routes.size());
383 assertEquals(1, testingPeer.getBgpPeerState().getSessionEstablishedCount().intValue());
384 assertEquals(1, testingPeer.getBgpPeerState().getRouteTable().size());
385 assertNotNull(testingPeer.getBgpSessionState());
389 ub.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setWithdrawnRoutes(prefs).build());
390 this.classic.onMessage(this.session, ub.build());
391 assertEquals(3, this.routes.size());
392 this.classic.onMessage(this.session, new KeepaliveBuilder().build());
393 this.classic.onMessage(this.session, new UpdateBuilder().setAttributes(
394 new AttributesBuilder().addAugmentation(
396 new Attributes2Builder().setMpUnreachNlri(
397 new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build()).build());
398 this.classic.releaseConnection();
402 public void testClose() {