BUG-2383 : wire AdjRibOutListener to BGPPeer
[bgpcep.git] / bgp / rib-impl / src / test / java / org / opendaylight / protocol / bgp / rib / impl / ApplicationPeerTest.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.protocol.bgp.rib.impl;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.mockito.Matchers.any;
13
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;
30 import java.util.Map;
31 import java.util.Set;
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;
136
137 public class ApplicationPeerTest {
138
139     private final TablesKey tk = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
140     private final TablesKey lk = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
141
142     private RIBImpl r;
143
144     @Mock
145     BGPDispatcher dispatcher;
146
147     @Mock
148     ReconnectStrategyFactory tcpStrategyFactory;
149
150     @Mock
151     DataBroker dps;
152
153     @Mock
154     DOMDataBroker dom;
155
156     @Mock
157     WriteTransaction transWrite;
158
159     @Mock
160     DOMDataWriteTransaction domTransWrite;
161
162     @Mock
163     BindingTransactionChain chain;
164
165     @Mock
166     DOMTransactionChain domChain;
167
168     BindingCodecTreeFactory codecFactory;
169
170     @Mock
171     ApplicationPeer peer;
172
173     @Mock
174     AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
175
176     @Mock
177     CheckedFuture<?,?> future;
178
179     @Mock
180     Optional<Rib> o;
181
182     @Mock
183     DOMDataTreeChangeService service;
184
185     BGPSessionImpl session;
186
187     List<InstanceIdentifier<?>> routes;
188
189     private BGPPeer classic;
190
191     @Mock
192     Channel channel;
193
194     @Mock
195     ChannelPipeline pipeline;
196
197     @Mock
198     private EventLoop eventLoop;
199
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};
205
206     private RIBActivator a1;
207     private org.opendaylight.protocol.bgp.linkstate.RIBActivator a2;
208
209     @SuppressWarnings("unchecked")
210     @Before
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>() {
238
239             @Override
240             public Object answer(final InvocationOnMock invocation) throws Throwable {
241                 final Object[] args = invocation.getArguments();
242                 ApplicationPeerTest.this.routes.add((InstanceIdentifier<?>) args[1]);
243                 return args[1];
244             }
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>() {
258
259             @Override
260             public Object answer(final InvocationOnMock invocation) throws Throwable {
261                 final Object[] args = invocation.getArguments();
262                 ApplicationPeerTest.this.routes.remove(args[1]);
263                 return args[1];
264             }
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));
275     }
276
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));
281         return codec;
282     }
283
284     private ModuleInfoBackedContext createClassLoadingStrategy() {
285         final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
286
287         try {
288             ctx.registerModuleInfo(BindingReflections.getModuleInfo(LinkstateRoute.class));
289             ctx.registerModuleInfo(BindingReflections.getModuleInfo(Ipv4Route.class));
290         } catch (final Exception e) {
291             throw Throwables.propagate(e);
292         }
293         return ctx;
294     }
295
296     @After
297     public void tearDown() {
298         this.a1.close();
299         this.a2.close();
300     }
301
302     @Test
303     @Ignore
304     public void testOnDataChanged() {
305         final Map<InstanceIdentifier<?>, DataObject> created = new HashMap<>();
306
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());
311
312         final Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
313
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());
326
327         final Set<InstanceIdentifier<?>> removed = new HashSet<>();
328         removed.add(iid);
329
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());
335
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());
341     }
342
343     /* This test relies on RIBImpl.updateTables to popuplate the loc RIB. Refactor it to use new RIB */
344     @Test
345     @Ignore
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));
352
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>() {
361
362             @Override
363             public Object answer(final InvocationOnMock invocation) throws Throwable {
364                 final Object[] args = invocation.getArguments();
365                 ((SessionRIBsOut)args[0]).run();
366                 return null;
367             }
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());
378
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());
386         }
387
388         ub.setNlri(null);
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(
395                     Attributes2.class,
396                     new Attributes2Builder().setMpUnreachNlri(
397                             new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build()).build());
398         this.classic.releaseConnection();
399     }
400
401     @Test
402     public void testClose() {
403         this.peer.close();
404     }
405 }