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.RIBExtensionProviderContext;
61 import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
62 import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.Ipv4Routes;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4Route;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4RouteBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4RouteKey;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.DomainIdentifier;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Identifier;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Ipv4InterfaceIdentifier;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ProtocolId;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.TopologyIdentifier;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.LinkCaseBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.LinkDescriptorsBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.LocalNodeDescriptors;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.LocalNodeDescriptorsBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.RemoteNodeDescriptors;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.RemoteNodeDescriptorsBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.LinkstateRoutes;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.LinkstateRoute;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.LinkstateRouteBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.LinkstateRouteKey;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.IsisNodeCaseBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.OspfNodeCaseBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.isis.node._case.IsisNodeBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.ospf.node._case.OspfNodeBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.KeepaliveBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.OpenBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.UpdateBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParametersBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.OptionalCapabilitiesBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.NlriBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.WithdrawnRoutesBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2Builder;
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.open.bgp.parameters.optional.capabilities.c.parameters.MultiprotocolCaseBuilder;
104 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;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRibId;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.LocRib;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
118 import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTreeFactory;
119 import org.opendaylight.yangtools.binding.data.codec.gen.impl.DataObjectSerializerGenerator;
120 import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
121 import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
122 import org.opendaylight.yangtools.sal.binding.generator.api.ClassLoadingStrategy;
123 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
124 import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
125 import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
126 import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
127 import org.opendaylight.yangtools.yang.binding.DataObject;
128 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
129 import org.opendaylight.yangtools.yang.binding.Notification;
130 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
131 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
132 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
133 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
135 public class ApplicationPeerTest {
137 private final TablesKey tk = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
138 private final TablesKey lk = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
143 BGPDispatcher dispatcher;
146 ReconnectStrategyFactory tcpStrategyFactory;
155 WriteTransaction transWrite;
158 DOMDataWriteTransaction domTransWrite;
161 BindingTransactionChain chain;
164 DOMTransactionChain domChain;
166 BindingCodecTreeFactory codecFactory;
169 ApplicationPeer peer;
172 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
175 CheckedFuture<?,?> future;
181 DOMDataTreeChangeService service;
183 BGPSessionImpl session;
185 List<InstanceIdentifier<?>> routes;
187 private BGPPeer classic;
193 private EventLoop eventLoop;
195 private final byte[] linkNlri = new byte[] { 0, 2, 0, 0x65, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, (byte) 0x1a,
196 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,
197 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,
198 4, 0x0a, 0x0b, 0x0c, 0x0d, 1, 3, 0, 4, (byte) 0xc5, 0x14, (byte) 0xa0, (byte) 0x2a, 1, 4, 0, 4, (byte) 0xc5,
199 0x14, (byte) 0xa0, 0x28, 1, 7, 0, 2, 0, 3};
201 private RIBActivator a1;
202 private org.opendaylight.protocol.bgp.linkstate.RIBActivator a2;
204 @SuppressWarnings("unchecked")
206 public void setUp() throws InterruptedException, ExecutionException, ReadFailedException {
207 MockitoAnnotations.initMocks(this);
208 final ModuleInfoBackedContext strategy = createClassLoadingStrategy();
209 final SchemaContext schemaContext = strategy.tryToCreateSchemaContext().get();
210 this.codecFactory = createCodecFactory(strategy,schemaContext);
211 final List<BgpTableType> localTables = new ArrayList<>();
212 this.routes = new ArrayList<>();
213 localTables.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
214 localTables.add(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class));
215 final RIBExtensionProviderContext context = new SimpleRIBExtensionProviderContext();
216 this.a1 = new RIBActivator();
217 this.a1.startRIBExtensionProvider(context);
218 this.a2 = new org.opendaylight.protocol.bgp.linkstate.RIBActivator();
219 this.a2.startRIBExtensionProvider(context);
220 Mockito.doReturn(this.chain).when(this.dps).createTransactionChain(Mockito.any(RIBImpl.class));
221 Mockito.doReturn(this.domChain).when(this.dom).createTransactionChain(Mockito.any(BGPPeer.class));
222 final Map<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension> map = new HashMap<>();
223 map.put(DOMDataTreeChangeService.class, this.service);
224 Mockito.doReturn(null).when(this.service).registerDataTreeChangeListener(Mockito.any(DOMDataTreeIdentifier.class), Mockito.any(DOMDataTreeChangeListener.class));
225 Mockito.doReturn(map).when(this.dom).getSupportedExtensions();
226 Mockito.doReturn(this.o).when(this.future).get();
227 Mockito.doNothing().when(this.domChain).close();
228 Mockito.doNothing().when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Rib.class));
229 Mockito.doNothing().when(this.domTransWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
230 Mockito.doNothing().when(this.domTransWrite).merge(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
231 Mockito.doNothing().when(this.domTransWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class));
232 Mockito.doAnswer(new Answer<Object>() {
235 public Object answer(final InvocationOnMock invocation) throws Throwable {
236 final Object[] args = invocation.getArguments();
237 ApplicationPeerTest.this.routes.add((InstanceIdentifier<?>) args[1]);
240 }).when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Route.class), Mockito.eq(true));
241 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));
242 Mockito.doReturn(false).when(this.o).isPresent();
243 Mockito.doReturn(this.future).when(this.transWrite).submit();
244 Mockito.doReturn(this.future).when(this.domTransWrite).submit();
245 Mockito.doNothing().when(this.future).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
246 Mockito.doReturn(this.transWrite).when(this.chain).newWriteOnlyTransaction();
247 Mockito.doReturn(this.domTransWrite).when(this.domChain).newWriteOnlyTransaction();
248 Mockito.doReturn(this.eventLoop).when(this.channel).eventLoop();
249 Mockito.doReturn("channel").when(this.channel).toString();
250 Mockito.doAnswer(new Answer<Object>() {
253 public Object answer(final InvocationOnMock invocation) throws Throwable {
254 final Object[] args = invocation.getArguments();
255 ApplicationPeerTest.this.routes.remove(args[1]);
258 }).when(this.transWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class));
259 this.r = new RIBImpl(new RibId("test"), new AsNumber(5L), new Ipv4Address("127.0.0.1"),
260 new Ipv4Address("128.0.0.1"), context , this.dispatcher, this.tcpStrategyFactory, this.codecFactory, this.tcpStrategyFactory, this.dps, this.dom, localTables,GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy());
261 this.peer = new ApplicationPeer(new ApplicationRibId("t"), new Ipv4Address("127.0.0.1"), this.r);
262 this.r.onGlobalContextUpdated(schemaContext);
263 final ReadOnlyTransaction readTx = Mockito.mock(ReadOnlyTransaction.class);
264 Mockito.doReturn(readTx).when(this.dps).newReadOnlyTransaction();
265 final CheckedFuture<Optional<DataObject>, ReadFailedException> readFuture = Mockito.mock(CheckedFuture.class);
266 Mockito.doReturn(Optional.<DataObject>absent()).when(readFuture).checkedGet();
267 Mockito.doReturn(readFuture).when(readTx).read(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class));
270 private BindingCodecTreeFactory createCodecFactory(final ClassLoadingStrategy str, final SchemaContext ctx) {
271 final DataObjectSerializerGenerator generator = StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()));
272 final BindingNormalizedNodeCodecRegistry codec = new BindingNormalizedNodeCodecRegistry(generator);
273 codec.onBindingRuntimeContextUpdated(BindingRuntimeContext.create(str, ctx));
277 private ModuleInfoBackedContext createClassLoadingStrategy() {
278 final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
281 ctx.registerModuleInfo(BindingReflections.getModuleInfo(LinkstateRoute.class));
282 ctx.registerModuleInfo(BindingReflections.getModuleInfo(Ipv4Route.class));
283 } catch (final Exception e) {
284 throw Throwables.propagate(e);
290 public void tearDown() {
297 public void testOnDataChanged() {
298 final Map<InstanceIdentifier<?>, DataObject> created = new HashMap<>();
300 InstanceIdentifier<?> iid = InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(new RibId("foo")))
301 .child(LocRib.class).child(Tables.class, this.tk)
302 .child((Class)Ipv4Routes.class).child(Ipv4Route.class, new Ipv4RouteKey(new Ipv4Prefix("127.0.0.1/32")));
303 created.put(iid, new Ipv4RouteBuilder().setPrefix(new Ipv4Prefix("127.0.0.1/32")).setAttributes(new AttributesBuilder().build()).build());
305 final Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
307 iid = InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(new RibId("foo")))
308 .child(LocRib.class).child(Tables.class, this.lk)
309 .child((Class)LinkstateRoutes.class).child(LinkstateRoute.class, new LinkstateRouteKey(this.linkNlri));
310 final LocalNodeDescriptors lnd = new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber(72L)).setDomainId(new DomainIdentifier(673720360L))
311 .setCRouterIdentifier(new IsisNodeCaseBuilder().setIsisNode(new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 0, 0, 0, 0, 0, 66 })).build()).build()).build();
312 final RemoteNodeDescriptors rnd = new RemoteNodeDescriptorsBuilder().setAsNumber(new AsNumber(72L)).setDomainId(new DomainIdentifier(673720360L))
313 .setCRouterIdentifier(new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(64L).build()).build()).build();
314 updated.put(iid, new LinkstateRouteBuilder().setProtocolId(ProtocolId.IsisLevel2).setIdentifier(new Identifier(BigInteger.ONE)).setObjectType(
315 new LinkCaseBuilder().setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("197.20.160.42")))
316 .setIpv4NeighborAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("197.20.160.40"))).setLinkLocalIdentifier(16909060L).setLinkRemoteIdentifier(168496141L).setMultiTopologyId(new TopologyIdentifier(3)).build())
317 .setLocalNodeDescriptors(lnd)
318 .setRemoteNodeDescriptors(rnd).build()).build());
320 final Set<InstanceIdentifier<?>> removed = new HashSet<>();
323 Mockito.doReturn(created).when(this.change).getCreatedData();
324 Mockito.doReturn(updated).when(this.change).getUpdatedData();
325 Mockito.doReturn(Collections.EMPTY_SET).when(this.change).getRemovedPaths();
326 //this.peer.onDataChanged(this.change);
327 assertEquals(3, this.routes.size());
329 Mockito.doReturn(Collections.EMPTY_MAP).when(this.change).getCreatedData();
330 Mockito.doReturn(Collections.EMPTY_MAP).when(this.change).getUpdatedData();
331 Mockito.doReturn(removed).when(this.change).getRemovedPaths();
332 //this.peer.onDataChanged(this.change);
333 assertEquals(2, this.routes.size());
336 /* This test relies on RIBImpl.updateTables to popuplate the loc RIB. Refactor it to use new RIB */
339 public void testClassicPeer() {
340 this.classic = new BGPPeer("testPeer", this.r);
341 Mockito.doReturn(null).when(this.eventLoop).schedule(any(Runnable.class), any(long.class), any(TimeUnit.class));
342 Mockito.doReturn(Boolean.TRUE).when(this.channel).isWritable();
343 Mockito.doReturn(null).when(this.channel).close();
344 Mockito.doReturn(new DefaultChannelPromise(this.channel)).when(this.channel).writeAndFlush(any(Notification.class));
346 Mockito.doReturn(new InetSocketAddress("localhost", 12345)).when(this.channel).remoteAddress();
347 Mockito.doReturn(new InetSocketAddress("localhost", 12345)).when(this.channel).localAddress();
348 final List<BgpParameters> params = Lists.newArrayList(new BgpParametersBuilder().setOptionalCapabilities(Lists.newArrayList(new OptionalCapabilitiesBuilder().setCParameters(new MultiprotocolCaseBuilder()
349 .setMultiprotocolCapability(new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build())).build());
350 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);
351 assertEquals(this.r, this.classic.getRib());
352 assertEquals("testPeer", this.classic.getName());
353 Mockito.doAnswer(new Answer<Object>() {
356 public Object answer(final InvocationOnMock invocation) throws Throwable {
357 final Object[] args = invocation.getArguments();
358 ((SessionRIBsOut)args[0]).run();
361 }).when(this.eventLoop).submit(Mockito.any(Runnable.class));
362 this.classic.onSessionUp(this.session);
363 Assert.assertArrayEquals(new byte[] {1, 1, 1, 1}, this.classic.getRawIdentifier());
364 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());
365 final List<Ipv4Prefix> prefs = Lists.newArrayList(new Ipv4Prefix("127.0.0.1/32"), new Ipv4Prefix("2.2.2.2/24"));
366 final UpdateBuilder ub = new UpdateBuilder();
367 ub.setNlri(new NlriBuilder().setNlri(prefs).build());
368 ub.setAttributes(new AttributesBuilder().build());
369 this.classic.onMessage(this.session, ub.build());
370 assertEquals(3, this.routes.size());
372 //create new peer so that it gets advertized routes from RIB
373 try (final BGPPeer testingPeer = new BGPPeer("testingPeer", this.r)) {
374 testingPeer.onSessionUp(this.session);
375 assertEquals(3, this.routes.size());
376 assertEquals(1, testingPeer.getBgpPeerState().getSessionEstablishedCount().intValue());
377 assertEquals(1, testingPeer.getBgpPeerState().getRouteTable().size());
378 assertNotNull(testingPeer.getBgpSessionState());
382 ub.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setWithdrawnRoutes(prefs).build());
383 this.classic.onMessage(this.session, ub.build());
384 assertEquals(3, this.routes.size());
385 this.classic.onMessage(this.session, new KeepaliveBuilder().build());
386 this.classic.onMessage(this.session, new UpdateBuilder().setAttributes(
387 new AttributesBuilder().addAugmentation(
389 new Attributes2Builder().setMpUnreachNlri(
390 new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build()).build());
391 this.classic.releaseConnection();
395 public void testClose() {