BUG-2383 : Application peer rework.
[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.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;
134
135 public class ApplicationPeerTest {
136
137     private final TablesKey tk = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
138     private final TablesKey lk = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
139
140     private RIBImpl r;
141
142     @Mock
143     BGPDispatcher dispatcher;
144
145     @Mock
146     ReconnectStrategyFactory tcpStrategyFactory;
147
148     @Mock
149     DataBroker dps;
150
151     @Mock
152     DOMDataBroker dom;
153
154     @Mock
155     WriteTransaction transWrite;
156
157     @Mock
158     DOMDataWriteTransaction domTransWrite;
159
160     @Mock
161     BindingTransactionChain chain;
162
163     @Mock
164     DOMTransactionChain domChain;
165
166     BindingCodecTreeFactory codecFactory;
167
168     @Mock
169     ApplicationPeer peer;
170
171     @Mock
172     AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
173
174     @Mock
175     CheckedFuture<?,?> future;
176
177     @Mock
178     Optional<Rib> o;
179
180     @Mock
181     DOMDataTreeChangeService service;
182
183     BGPSessionImpl session;
184
185     List<InstanceIdentifier<?>> routes;
186
187     private BGPPeer classic;
188
189     @Mock
190     Channel channel;
191
192     @Mock
193     private EventLoop eventLoop;
194
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};
200
201     private RIBActivator a1;
202     private org.opendaylight.protocol.bgp.linkstate.RIBActivator a2;
203
204     @SuppressWarnings("unchecked")
205     @Before
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>() {
233
234             @Override
235             public Object answer(final InvocationOnMock invocation) throws Throwable {
236                 final Object[] args = invocation.getArguments();
237                 ApplicationPeerTest.this.routes.add((InstanceIdentifier<?>) args[1]);
238                 return args[1];
239             }
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>() {
251
252             @Override
253             public Object answer(final InvocationOnMock invocation) throws Throwable {
254                 final Object[] args = invocation.getArguments();
255                 ApplicationPeerTest.this.routes.remove(args[1]);
256                 return args[1];
257             }
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));
268     }
269
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));
274         return codec;
275     }
276
277     private ModuleInfoBackedContext createClassLoadingStrategy() {
278         final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
279
280         try {
281             ctx.registerModuleInfo(BindingReflections.getModuleInfo(LinkstateRoute.class));
282             ctx.registerModuleInfo(BindingReflections.getModuleInfo(Ipv4Route.class));
283         } catch (final Exception e) {
284             throw Throwables.propagate(e);
285         }
286         return ctx;
287     }
288
289     @After
290     public void tearDown() {
291         this.a1.close();
292         this.a2.close();
293     }
294
295     @Test
296     @Ignore
297     public void testOnDataChanged() {
298         final Map<InstanceIdentifier<?>, DataObject> created = new HashMap<>();
299
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());
304
305         final Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
306
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());
319
320         final Set<InstanceIdentifier<?>> removed = new HashSet<>();
321         removed.add(iid);
322
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());
328
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());
334     }
335
336     /* This test relies on RIBImpl.updateTables to popuplate the loc RIB. Refactor it to use new RIB */
337     @Test
338     @Ignore
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));
345
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>() {
354
355             @Override
356             public Object answer(final InvocationOnMock invocation) throws Throwable {
357                 final Object[] args = invocation.getArguments();
358                 ((SessionRIBsOut)args[0]).run();
359                 return null;
360             }
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());
371
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());
379         }
380
381         ub.setNlri(null);
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(
388                     Attributes2.class,
389                     new Attributes2Builder().setMpUnreachNlri(
390                             new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build()).build());
391         this.classic.releaseConnection();
392     }
393
394     @Test
395     public void testClose() {
396         this.peer.close();
397     }
398 }