BUG-2982 : moved path-attributes container to grouping
[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.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;
28 import java.util.Map;
29 import java.util.Set;
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;
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     private EventLoop eventLoop;
196
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};
202
203     private RIBActivator a1;
204     private org.opendaylight.protocol.bgp.linkstate.RIBActivator a2;
205
206     @SuppressWarnings("unchecked")
207     @Before
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>() {
234
235             @Override
236             public Object answer(final InvocationOnMock invocation) throws Throwable {
237                 final Object[] args = invocation.getArguments();
238                 ApplicationPeerTest.this.routes.add((InstanceIdentifier<?>) args[1]);
239                 return args[1];
240             }
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>() {
252
253             @Override
254             public Object answer(final InvocationOnMock invocation) throws Throwable {
255                 final Object[] args = invocation.getArguments();
256                 ApplicationPeerTest.this.routes.remove(args[1]);
257                 return args[1];
258             }
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));
269     }
270
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));
275         return codec;
276     }
277
278     private ModuleInfoBackedContext createClassLoadingStrategy() {
279         final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
280
281         try {
282             ctx.registerModuleInfo(BindingReflections.getModuleInfo(LinkstateRoute.class));
283             ctx.registerModuleInfo(BindingReflections.getModuleInfo(Ipv4Route.class));
284         } catch (final Exception e) {
285             throw Throwables.propagate(e);
286         }
287         return ctx;
288     }
289
290     @After
291     public void tearDown() {
292         this.a1.close();
293         this.a2.close();
294     }
295
296     @Test
297     public void testOnDataChanged() {
298         final Map<InstanceIdentifier<?>, DataObject> created = new HashMap<>();
299         final AdjRIBsIn<Ipv4Prefix, Ipv4Route> a4 = this.r.getTable(this.tk);
300         assertNotNull(a4);
301
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());
306
307         final Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
308         final AdjRIBsIn<CLinkstateDestination, LinkstateRoute> al = this.r.getTable(this.lk);
309         assertNotNull(al);
310
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());
323
324         final Set<InstanceIdentifier<?>> removed = new HashSet<>();
325         removed.add(iid);
326
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());
332
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());
338     }
339
340     /* This test relies on RIBImpl.updateTables to popuplate the loc RIB. Refactor it to use new RIB */
341     @Test
342     @Ignore
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));
349
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>() {
358
359             @Override
360             public Object answer(final InvocationOnMock invocation) throws Throwable {
361                 final Object[] args = invocation.getArguments();
362                 ((SessionRIBsOut)args[0]).run();
363                 return null;
364             }
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());
375
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());
383         }
384
385         ub.setNlri(null);
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(
392                     Attributes2.class,
393                     new Attributes2Builder().setMpUnreachNlri(
394                             new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build()).build());
395         this.classic.releaseConnection();
396     }
397
398     @Test
399     public void testClose() {
400         final AdjRIBsIn<Ipv4Prefix, Ipv4Route> a4 = this.r.getTable(this.tk);
401         assertNotNull(a4);
402         this.peer.close();
403     }
404 }