Merge "Fix pep8 violations in peer/context.py"
[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.update.NlriBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder;
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.BgpTableType;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes2;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes2Builder;
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.path.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.rib.rev130925.route.AttributesBuilder;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
121 import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTreeFactory;
122 import org.opendaylight.yangtools.binding.data.codec.gen.impl.DataObjectSerializerGenerator;
123 import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
124 import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
125 import org.opendaylight.yangtools.sal.binding.generator.api.ClassLoadingStrategy;
126 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
127 import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
128 import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
129 import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
130 import org.opendaylight.yangtools.yang.binding.DataObject;
131 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
132 import org.opendaylight.yangtools.yang.binding.Notification;
133 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
134 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
135 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
136 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
137
138 public class ApplicationPeerTest {
139
140     private final TablesKey tk = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
141     private final TablesKey lk = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
142
143     private RIBImpl r;
144
145     @Mock
146     BGPDispatcher dispatcher;
147
148     @Mock
149     ReconnectStrategyFactory tcpStrategyFactory;
150
151     @Mock
152     DataBroker dps;
153
154     @Mock
155     DOMDataBroker dom;
156
157     @Mock
158     WriteTransaction transWrite;
159
160     @Mock
161     DOMDataWriteTransaction domTransWrite;
162
163     @Mock
164     BindingTransactionChain chain;
165
166     @Mock
167     DOMTransactionChain domChain;
168
169     BindingCodecTreeFactory codecFactory;
170
171     @Mock
172     ApplicationPeer peer;
173
174     @Mock
175     AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
176
177     @Mock
178     CheckedFuture<?,?> future;
179
180     @Mock
181     Optional<Rib> o;
182
183     @Mock
184     DOMDataTreeChangeService service;
185
186     BGPSessionImpl session;
187
188     List<InstanceIdentifier<?>> routes;
189
190     private BGPPeer classic;
191
192     @Mock
193     Channel channel;
194
195     @Mock
196     private EventLoop eventLoop;
197
198     private final byte[] linkNlri = new byte[] { 0, 2, 0, 0x65, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, (byte) 0x1a,
199         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,
200         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,
201         4, 0x0a, 0x0b, 0x0c, 0x0d, 1, 3, 0, 4, (byte) 0xc5, 0x14, (byte) 0xa0, (byte) 0x2a, 1, 4, 0, 4, (byte) 0xc5,
202         0x14, (byte) 0xa0, 0x28, 1, 7, 0, 2, 0, 3};
203
204     private RIBActivator a1;
205     private org.opendaylight.protocol.bgp.linkstate.RIBActivator a2;
206
207     @SuppressWarnings("unchecked")
208     @Before
209     public void setUp() throws InterruptedException, ExecutionException, ReadFailedException {
210         MockitoAnnotations.initMocks(this);
211         final ModuleInfoBackedContext strategy = createClassLoadingStrategy();
212         final SchemaContext schemaContext = strategy.tryToCreateSchemaContext().get();
213         this.codecFactory = createCodecFactory(strategy,schemaContext);
214         final List<BgpTableType> localTables = new ArrayList<>();
215         this.routes = new ArrayList<>();
216         localTables.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
217         localTables.add(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class));
218         final RIBExtensionProviderContext context = new SimpleRIBExtensionProviderContext();
219         this.a1 = new RIBActivator();
220         this.a1.startRIBExtensionProvider(context);
221         this.a2 = new org.opendaylight.protocol.bgp.linkstate.RIBActivator();
222         this.a2.startRIBExtensionProvider(context);
223         Mockito.doReturn(this.chain).when(this.dps).createTransactionChain(Mockito.any(RIBImpl.class));
224         Mockito.doReturn(this.domChain).when(this.dom).createTransactionChain(Mockito.any(BGPPeer.class));
225         final Map<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension> map = new HashMap<>();
226         map.put(DOMDataTreeChangeService.class, this.service);
227         Mockito.doReturn(null).when(this.service).registerDataTreeChangeListener(Mockito.any(DOMDataTreeIdentifier.class), Mockito.any(DOMDataTreeChangeListener.class));
228         Mockito.doReturn(map).when(this.dom).getSupportedExtensions();
229         Mockito.doReturn(this.o).when(this.future).get();
230         Mockito.doNothing().when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Rib.class));
231         Mockito.doNothing().when(this.domTransWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
232         Mockito.doNothing().when(this.domTransWrite).merge(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
233         Mockito.doNothing().when(this.domTransWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class));
234         Mockito.doAnswer(new Answer<Object>() {
235
236             @Override
237             public Object answer(final InvocationOnMock invocation) throws Throwable {
238                 final Object[] args = invocation.getArguments();
239                 ApplicationPeerTest.this.routes.add((InstanceIdentifier<?>) args[1]);
240                 return args[1];
241             }
242         }).when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Route.class), Mockito.eq(true));
243         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));
244         Mockito.doReturn(false).when(this.o).isPresent();
245         Mockito.doReturn(this.future).when(this.transWrite).submit();
246         Mockito.doReturn(this.future).when(this.domTransWrite).submit();
247         Mockito.doNothing().when(this.future).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
248         Mockito.doReturn(this.transWrite).when(this.chain).newWriteOnlyTransaction();
249         Mockito.doReturn(this.domTransWrite).when(this.domChain).newWriteOnlyTransaction();
250         Mockito.doReturn(this.eventLoop).when(this.channel).eventLoop();
251         Mockito.doReturn("channel").when(this.channel).toString();
252         Mockito.doAnswer(new Answer<Object>() {
253
254             @Override
255             public Object answer(final InvocationOnMock invocation) throws Throwable {
256                 final Object[] args = invocation.getArguments();
257                 ApplicationPeerTest.this.routes.remove(args[1]);
258                 return args[1];
259             }
260         }).when(this.transWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class));
261         this.r = new RIBImpl(new RibId("test"), new AsNumber(5L), new Ipv4Address("127.0.0.1"),
262             new Ipv4Address("128.0.0.1"), context , this.dispatcher, this.tcpStrategyFactory, this.codecFactory, this.tcpStrategyFactory, this.dps, this.dom, localTables,GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy());
263         this.peer = new ApplicationPeer(new ApplicationRibId("t"), new Ipv4Address("127.0.0.1"), this.r);
264         this.r.onGlobalContextUpdated(schemaContext);
265         final ReadOnlyTransaction readTx = Mockito.mock(ReadOnlyTransaction.class);
266         Mockito.doReturn(readTx).when(this.dps).newReadOnlyTransaction();
267         final CheckedFuture<Optional<DataObject>, ReadFailedException> readFuture = Mockito.mock(CheckedFuture.class);
268         Mockito.doReturn(Optional.<DataObject>absent()).when(readFuture).checkedGet();
269         Mockito.doReturn(readFuture).when(readTx).read(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class));
270     }
271
272     private BindingCodecTreeFactory createCodecFactory(final ClassLoadingStrategy str, final SchemaContext ctx) {
273         final DataObjectSerializerGenerator generator = StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()));
274         final BindingNormalizedNodeCodecRegistry codec = new BindingNormalizedNodeCodecRegistry(generator);
275         codec.onBindingRuntimeContextUpdated(BindingRuntimeContext.create(str, ctx));
276         return codec;
277     }
278
279     private ModuleInfoBackedContext createClassLoadingStrategy() {
280         final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
281
282         try {
283             ctx.registerModuleInfo(BindingReflections.getModuleInfo(LinkstateRoute.class));
284             ctx.registerModuleInfo(BindingReflections.getModuleInfo(Ipv4Route.class));
285         } catch (final Exception e) {
286             throw Throwables.propagate(e);
287         }
288         return ctx;
289     }
290
291     @After
292     public void tearDown() {
293         this.a1.close();
294         this.a2.close();
295     }
296
297     @Test
298     public void testOnDataChanged() {
299         final Map<InstanceIdentifier<?>, DataObject> created = new HashMap<>();
300         final AdjRIBsIn<Ipv4Prefix, Ipv4Route> a4 = this.r.getTable(this.tk);
301         assertNotNull(a4);
302
303         InstanceIdentifier<?> iid = InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(new RibId("foo")))
304             .child(LocRib.class).child(Tables.class, this.tk)
305             .child((Class)Ipv4Routes.class).child(Ipv4Route.class, new Ipv4RouteKey(new Ipv4Prefix("127.0.0.1/32")));
306         created.put(iid, new Ipv4RouteBuilder().setPrefix(new Ipv4Prefix("127.0.0.1/32")).setAttributes(new AttributesBuilder().build()).build());
307
308         final Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
309         final AdjRIBsIn<CLinkstateDestination, LinkstateRoute> al = this.r.getTable(this.lk);
310         assertNotNull(al);
311
312         iid = InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(new RibId("foo")))
313             .child(LocRib.class).child(Tables.class, this.lk)
314             .child((Class)LinkstateRoutes.class).child(LinkstateRoute.class, new LinkstateRouteKey(this.linkNlri));
315         final LocalNodeDescriptors lnd = new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber(72L)).setDomainId(new DomainIdentifier(673720360L))
316             .setCRouterIdentifier(new IsisNodeCaseBuilder().setIsisNode(new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 0, 0, 0, 0, 0, 66 })).build()).build()).build();
317         final RemoteNodeDescriptors rnd = new RemoteNodeDescriptorsBuilder().setAsNumber(new AsNumber(72L)).setDomainId(new DomainIdentifier(673720360L))
318             .setCRouterIdentifier(new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(64L).build()).build()).build();
319         updated.put(iid, new LinkstateRouteBuilder().setProtocolId(ProtocolId.IsisLevel2).setIdentifier(new Identifier(BigInteger.ONE)).setObjectType(
320             new LinkCaseBuilder().setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("197.20.160.42")))
321                 .setIpv4NeighborAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("197.20.160.40"))).setLinkLocalIdentifier(16909060L).setLinkRemoteIdentifier(168496141L).setMultiTopologyId(new TopologyIdentifier(3)).build())
322                 .setLocalNodeDescriptors(lnd)
323                 .setRemoteNodeDescriptors(rnd).build()).build());
324
325         final Set<InstanceIdentifier<?>> removed = new HashSet<>();
326         removed.add(iid);
327
328         Mockito.doReturn(created).when(this.change).getCreatedData();
329         Mockito.doReturn(updated).when(this.change).getUpdatedData();
330         Mockito.doReturn(Collections.EMPTY_SET).when(this.change).getRemovedPaths();
331         this.peer.onDataChanged(this.change);
332         assertEquals(3, this.routes.size());
333
334         Mockito.doReturn(Collections.EMPTY_MAP).when(this.change).getCreatedData();
335         Mockito.doReturn(Collections.EMPTY_MAP).when(this.change).getUpdatedData();
336         Mockito.doReturn(removed).when(this.change).getRemovedPaths();
337         this.peer.onDataChanged(this.change);
338         assertEquals(2, this.routes.size());
339     }
340
341     /* This test relies on RIBImpl.updateTables to popuplate the loc RIB. Refactor it to use new RIB */
342     @Test
343     @Ignore
344     public void testClassicPeer() {
345         this.classic = new BGPPeer("testPeer", this.r);
346         Mockito.doReturn(null).when(this.eventLoop).schedule(any(Runnable.class), any(long.class), any(TimeUnit.class));
347         Mockito.doReturn(Boolean.TRUE).when(this.channel).isWritable();
348         Mockito.doReturn(null).when(this.channel).close();
349         Mockito.doReturn(new DefaultChannelPromise(this.channel)).when(this.channel).writeAndFlush(any(Notification.class));
350
351         Mockito.doReturn(new InetSocketAddress("localhost", 12345)).when(this.channel).remoteAddress();
352         Mockito.doReturn(new InetSocketAddress("localhost", 12345)).when(this.channel).localAddress();
353         final List<BgpParameters> params = Lists.newArrayList(new BgpParametersBuilder().setOptionalCapabilities(Lists.newArrayList(new OptionalCapabilitiesBuilder().setCParameters(new MultiprotocolCaseBuilder()
354             .setMultiprotocolCapability(new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build())).build());
355         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);
356         assertEquals(this.r, this.classic.getRib());
357         assertEquals("testPeer", this.classic.getName());
358         Mockito.doAnswer(new Answer<Object>() {
359
360             @Override
361             public Object answer(final InvocationOnMock invocation) throws Throwable {
362                 final Object[] args = invocation.getArguments();
363                 ((SessionRIBsOut)args[0]).run();
364                 return null;
365             }
366         }).when(this.eventLoop).submit(Mockito.any(Runnable.class));
367         this.classic.onSessionUp(this.session);
368         Assert.assertArrayEquals(new byte[] {1, 1, 1, 1}, this.classic.getRawIdentifier());
369         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());
370         final List<Ipv4Prefix> prefs = Lists.newArrayList(new Ipv4Prefix("127.0.0.1/32"), new Ipv4Prefix("2.2.2.2/24"));
371         final UpdateBuilder ub = new UpdateBuilder();
372         ub.setNlri(new NlriBuilder().setNlri(prefs).build());
373         ub.setPathAttributes(new PathAttributesBuilder().build());
374         this.classic.onMessage(this.session, ub.build());
375         assertEquals(3, this.routes.size());
376
377         //create new peer so that it gets advertized routes from RIB
378         try (final BGPPeer testingPeer = new BGPPeer("testingPeer", this.r)) {
379             testingPeer.onSessionUp(this.session);
380             assertEquals(3, this.routes.size());
381             assertEquals(1, testingPeer.getBgpPeerState().getSessionEstablishedCount().intValue());
382             assertEquals(1, testingPeer.getBgpPeerState().getRouteTable().size());
383             assertNotNull(testingPeer.getBgpSessionState());
384         }
385
386         ub.setNlri(null);
387         ub.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setWithdrawnRoutes(prefs).build());
388         this.classic.onMessage(this.session, ub.build());
389         assertEquals(3, this.routes.size());
390         this.classic.onMessage(this.session, new KeepaliveBuilder().build());
391         this.classic.onMessage(this.session, new UpdateBuilder().setPathAttributes(
392             new PathAttributesBuilder().addAugmentation(
393                     PathAttributes2.class,
394                     new PathAttributes2Builder().setMpUnreachNlri(
395                             new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build()).build());
396         this.classic.releaseConnection();
397     }
398
399     @Test
400     public void testClose() {
401         final AdjRIBsIn<Ipv4Prefix, Ipv4Route> a4 = this.r.getTable(this.tk);
402         assertNotNull(a4);
403         this.peer.close();
404     }
405 }