Provide Add Path support for all AFI/SAFI
[bgpcep.git] / bgp / openconfig-state / src / test / java / org / opendaylight / protocol / bgp / state / StateProviderImplTest.java
1 /*
2  * Copyright (c) 2016 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
9 package org.opendaylight.protocol.bgp.state;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Matchers.eq;
14 import static org.mockito.Mockito.doAnswer;
15 import static org.mockito.Mockito.doReturn;
16 import static org.opendaylight.protocol.util.CheckUtil.checkNotPresentOperational;
17 import static org.opendaylight.protocol.util.CheckUtil.readDataOperational;
18
19 import java.math.BigDecimal;
20 import java.math.BigInteger;
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.Collections;
24 import java.util.List;
25 import java.util.Optional;
26 import java.util.concurrent.atomic.LongAdder;
27 import org.junit.Assert;
28 import org.junit.Before;
29 import org.junit.Test;
30 import org.mockito.Mock;
31 import org.mockito.MockitoAnnotations;
32 import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest;
33 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
34 import org.opendaylight.protocol.bgp.rib.spi.State;
35 import org.opendaylight.protocol.bgp.rib.spi.state.BGPAfiSafiState;
36 import org.opendaylight.protocol.bgp.rib.spi.state.BGPErrorHandlingState;
37 import org.opendaylight.protocol.bgp.rib.spi.state.BGPGracelfulRestartState;
38 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerMessagesState;
39 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
40 import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
41 import org.opendaylight.protocol.bgp.rib.spi.state.BGPSessionState;
42 import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateConsumer;
43 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTimersState;
44 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTransportState;
45 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
46 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
47 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.GracefulRestartBuilder;
48 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.graceful.restart.StateBuilder;
49 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.BgpNeighborState;
50 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.bgp.neighbor.prefix.counters_state.PrefixesBuilder;
51 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestart;
52 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
53 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
54 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandling;
55 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandlingBuilder;
56 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
57 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
58 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
59 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
60 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
61 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroup;
62 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupBuilder;
63 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
64 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
65 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.GlobalBuilder;
66 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
67 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ADDPATHS;
68 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ASN32;
69 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.BgpCapability;
70 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.CommunityType;
71 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.GRACEFULRESTART;
72 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
73 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.MPBGP;
74 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ROUTEREFRESH;
75 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
76 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
77 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
78 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
79 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
80 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
81 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
82 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
83 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
84 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
85 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
86 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Timeticks;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.BgpNeighborStateAugmentation;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.BgpNeighborStateAugmentationBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.GlobalAfiSafiStateAugmentation;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.GlobalAfiSafiStateAugmentationBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiGracefulRestartStateAugmentation;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiGracefulRestartStateAugmentationBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiStateAugmentation;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiStateAugmentationBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborErrorHandlingStateAugmentation;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborErrorHandlingStateAugmentationBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborGracefulRestartStateAugmentation;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborGracefulRestartStateAugmentationBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborStateAugmentation;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTimersStateAugmentation;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTimersStateAugmentationBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportStateAugmentation;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportStateAugmentationBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NetworkInstanceProtocol;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.PeerGroupStateAugmentation;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.PeerGroupStateAugmentationBuilder;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.MessagesBuilder;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.ReceivedBuilder;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.SentBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.BgpRib;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.RibId;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.Rib;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.RibKey;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
118 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
119 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
120
121 public class StateProviderImplTest extends AbstractConcurrentDataBrokerTest {
122     private final LongAdder totalPathsCounter = new LongAdder();
123     private final LongAdder totalPrefixesCounter = new LongAdder();
124     private final PortNumber localPort = new PortNumber(1790);
125     private final PortNumber remotePort = new PortNumber(179);
126     private final int restartTime = 15;
127     private final String ribId = "identifier-test";
128     private final InstanceIdentifier<Bgp> bgpInstanceIdentifier = InstanceIdentifier.create(NetworkInstances.class)
129         .child(NetworkInstance.class, new NetworkInstanceKey("global-bgp")).child(Protocols.class)
130         .child(Protocol.class, new ProtocolKey(BGP.class, this.ribId)).augmentation(NetworkInstanceProtocol.class)
131             .child(Bgp.class);
132     static final TablesKey TABLES_KEY = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
133     private final AsNumber as = new AsNumber(72L);
134     private final BgpId bgpId = new BgpId("127.0.0.1");
135     private final IpAddress neighborAddress = new IpAddress(new Ipv4Address("127.0.0.2"));
136     private final List<Class<? extends BgpCapability>> supportedCap = Arrays.asList(ASN32.class, ROUTEREFRESH.class,
137             MPBGP.class, ADDPATHS.class, GRACEFULRESTART.class);
138     @Mock
139     private BGPStateConsumer stateCollector;
140     @Mock
141     private BGPTableTypeRegistryConsumer tableTypeRegistry;
142     @Mock
143     private BGPRibState bgpRibState;
144     @Mock
145     private BGPPeerState bgpPeerState;
146     @Mock
147     private BGPSessionState bgpSessionState;
148     @Mock
149     private BGPPeerMessagesState bgpPeerMessagesState;
150     @Mock
151     private BGPTimersState timersState;
152     @Mock
153     private BGPTransportState bgpTransportState;
154     @Mock
155     private BGPErrorHandlingState bgpErrorHandlingState;
156     @Mock
157     private BGPGracelfulRestartState bgpGracelfulRestartState;
158     @Mock
159     private BGPAfiSafiState bgpAfiSafiState;
160
161     private final List<BGPPeerState> bgpPeerStates = new ArrayList<>();
162     private final List<BGPRibState> bgpRibStates = new ArrayList<>();
163
164     @Before
165     public void setUp() throws Exception {
166         MockitoAnnotations.initMocks(this);
167
168         doReturn(Optional.of(IPV4UNICAST.class))
169             .when(this.tableTypeRegistry).getAfiSafiType(eq(TABLES_KEY));
170
171         doReturn(this.bgpRibStates).when(this.stateCollector).getRibStats();
172         doReturn(this.bgpPeerStates).when(this.stateCollector).getPeerStats();
173
174         final KeyedInstanceIdentifier<Rib, RibKey> iid = InstanceIdentifier.create(BgpRib.class)
175             .child(Rib.class, new RibKey(new RibId(this.ribId)));
176         doReturn(iid).when(this.bgpRibState).getInstanceIdentifier();
177         doReturn(this.as).when(this.bgpRibState).getAs();
178         doReturn(this.bgpId).when(this.bgpRibState).getRouteId();
179
180         doAnswer(invocation -> this.totalPathsCounter.longValue())
181                 .when(this.bgpRibState).getTotalPathsCount();
182         doAnswer(invocation -> this.totalPrefixesCounter.longValue())
183                 .when(this.bgpRibState).getTotalPrefixesCount();
184         doAnswer(invocation -> this.totalPathsCounter.longValue())
185                 .when(this.bgpRibState).getPathCount(eq(TABLES_KEY));
186         doAnswer(invocation -> this.totalPrefixesCounter.longValue())
187                 .when(this.bgpRibState).getPrefixesCount(eq(TABLES_KEY));
188         doAnswer(invocation -> Collections.singletonMap(TABLES_KEY,
189             this.totalPrefixesCounter.longValue())).when(this.bgpRibState).getTablesPrefixesCount();
190         doAnswer(invocation -> Collections.singletonMap(TABLES_KEY,
191             this.totalPathsCounter.longValue())).when(this.bgpRibState).getPathsCount();
192
193         // Mock Peer
194         doReturn("test-group").when(this.bgpPeerState).getGroupId();
195         doReturn(iid).when(this.bgpPeerState).getInstanceIdentifier();
196         doAnswer(invocation -> this.totalPrefixesCounter.longValue()).when(this.bgpPeerState).getTotalPrefixes();
197         doAnswer(invocation -> this.totalPathsCounter.longValue()).when(this.bgpPeerState).getTotalPathsCount();
198         doReturn(this.neighborAddress).when(this.bgpPeerState).getNeighborAddress();
199         doReturn(this.bgpSessionState).when(this.bgpPeerState).getBGPSessionState();
200         doReturn(this.bgpPeerMessagesState).when(this.bgpPeerState).getBGPPeerMessagesState();
201
202         doReturn(1L).when(this.bgpPeerMessagesState).getNotificationMessagesReceivedCount();
203         doReturn(1L).when(this.bgpPeerMessagesState).getNotificationMessagesSentCount();
204         doReturn(1L).when(this.bgpPeerMessagesState).getUpdateMessagesReceivedCount();
205         doReturn(1L).when(this.bgpPeerMessagesState).getUpdateMessagesSentCount();
206         doReturn(State.UP).when(this.bgpSessionState).getSessionState();
207         doReturn(true).when(this.bgpSessionState).isAddPathCapabilitySupported();
208         doReturn(true).when(this.bgpSessionState).isAsn32CapabilitySupported();
209         doReturn(true).when(this.bgpSessionState).isGracefulRestartCapabilitySupported();
210         doReturn(true).when(this.bgpSessionState).isMultiProtocolCapabilitySupported();
211         doReturn(true).when(this.bgpSessionState).isRouterRefreshCapabilitySupported();
212
213         doReturn(this.timersState).when(this.bgpPeerState).getBGPTimersState();
214         doReturn(10L).when(this.timersState).getNegotiatedHoldTime();
215         doReturn(1L).when(this.timersState).getUpTime();
216
217         doReturn(this.bgpTransportState).when(this.bgpPeerState).getBGPTransportState();
218         doReturn(this.localPort).when(this.bgpTransportState).getLocalPort();
219         doReturn(this.neighborAddress).when(this.bgpTransportState).getRemoteAddress();
220         doReturn(this.remotePort).when(this.bgpTransportState).getRemotePort();
221
222         doReturn(this.bgpErrorHandlingState).when(this.bgpPeerState).getBGPErrorHandlingState();
223         doReturn(1L).when(this.bgpErrorHandlingState).getErroneousUpdateReceivedCount();
224
225         doReturn(this.bgpGracelfulRestartState).when(this.bgpPeerState).getBGPGracelfulRestart();
226         doReturn(true).when(this.bgpGracelfulRestartState).isGracefulRestartAdvertized(any());
227         doReturn(true).when(this.bgpGracelfulRestartState).isGracefulRestartReceived(any());
228         doReturn(true).when(this.bgpGracelfulRestartState).isLocalRestarting();
229         doReturn(true).when(this.bgpGracelfulRestartState).isPeerRestarting();
230         doReturn(this.restartTime).when(this.bgpGracelfulRestartState).getPeerRestartTime();
231
232         doReturn(this.bgpAfiSafiState).when(this.bgpPeerState).getBGPAfiSafiState();
233         doReturn(Collections.singleton(TABLES_KEY)).when(this.bgpAfiSafiState).getAfiSafisAdvertized();
234         doReturn(Collections.singleton(TABLES_KEY)).when(this.bgpAfiSafiState).getAfiSafisReceived();
235         doReturn(1L).when(this.bgpAfiSafiState).getPrefixesInstalledCount(any());
236         doReturn(2L).when(this.bgpAfiSafiState).getPrefixesReceivedCount(any());
237         doReturn(1L).when(this.bgpAfiSafiState).getPrefixesSentCount(any());
238         doReturn(true).when(this.bgpAfiSafiState).isAfiSafiSupported(any());
239         doReturn(true).when(this.bgpAfiSafiState).isGracefulRestartAdvertized(any());
240         doReturn(true).when(this.bgpAfiSafiState).isGracefulRestartReceived(any());
241     }
242
243     @Test
244     public void testActiveStateProvider() throws Exception {
245         doReturn(true).when(this.bgpRibState).isActive();
246         doReturn(true).when(this.bgpPeerState).isActive();
247
248         final StateProviderImpl stateProvider = new StateProviderImpl(getDataBroker(), 1, this.tableTypeRegistry,
249             this.stateCollector, "global-bgp");
250         stateProvider.init();
251
252         final Global globalExpected = buildGlobalExpected(0);
253         this.bgpRibStates.add(this.bgpRibState);
254         readDataOperational(getDataBroker(), this.bgpInstanceIdentifier, bgpRib -> {
255             final Global global = bgpRib.getGlobal();
256             assertEquals(globalExpected, global);
257             return bgpRib;
258         });
259
260         this.totalPathsCounter.increment();
261         this.totalPrefixesCounter.increment();
262
263         final Global globalExpected2 = buildGlobalExpected(1);
264         readDataOperational(getDataBroker(), this.bgpInstanceIdentifier, bgpRib -> {
265             final Global global = bgpRib.getGlobal();
266             assertEquals(globalExpected2, global);
267             return bgpRib;
268         });
269
270         this.totalPathsCounter.decrement();
271         this.totalPrefixesCounter.decrement();
272
273         final Global globalExpected3 = buildGlobalExpected(0);
274         readDataOperational(getDataBroker(), this.bgpInstanceIdentifier, bgpRib -> {
275             final Global global = bgpRib.getGlobal();
276             assertEquals(globalExpected3, global);
277             Assert.assertNull(bgpRib.getNeighbors());
278             Assert.assertNull(bgpRib.getPeerGroups());
279             return bgpRib;
280         });
281
282         this.bgpPeerStates.add(this.bgpPeerState);
283         final PeerGroup peerGroupExpected = buildGroupExpected();
284
285         this.totalPathsCounter.increment();
286         this.totalPrefixesCounter.increment();
287
288         final AfiSafis expectedAfiSafis = buildAfiSafis();
289         final ErrorHandling expectedErrorHandling = buildErrorHandling();
290         final GracefulRestart expectedGracefulRestart = buildGracefulRestart();
291         final Transport expectedTransport = buildTransport();
292         final Timers expectedTimers = buildTimers();
293         final BgpNeighborStateAugmentation expectedBgpNeighborState = buildBgpNeighborStateAugmentation();
294
295         readDataOperational(getDataBroker(), this.bgpInstanceIdentifier, bgpRib -> {
296             final Neighbors neighbors = bgpRib.getNeighbors();
297             Assert.assertNotNull(neighbors);
298             assertEquals(peerGroupExpected, bgpRib.getPeerGroups().getPeerGroup().get(0));
299             final Neighbor neighborResult = neighbors.getNeighbor().get(0);
300             assertEquals(this.neighborAddress, neighborResult.getNeighborAddress());
301             assertEquals(expectedAfiSafis, neighborResult.getAfiSafis());
302             assertEquals(expectedErrorHandling, neighborResult.getErrorHandling());
303             assertEquals(expectedGracefulRestart, neighborResult.getGracefulRestart());
304             assertEquals(expectedTransport, neighborResult.getTransport());
305             assertEquals(expectedTimers, neighborResult.getTimers());
306             final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group
307                     .State stateResult = neighborResult.getState();
308             assertEquals(expectedBgpNeighborState, stateResult.getAugmentation(BgpNeighborStateAugmentation.class));
309             assertEquals(BgpNeighborState.SessionState.ESTABLISHED, stateResult
310                     .getAugmentation(NeighborStateAugmentation.class).getSessionState());
311             final List<Class<? extends BgpCapability>> supportedCapabilitiesResult = stateResult
312                     .getAugmentation(NeighborStateAugmentation.class).getSupportedCapabilities();
313             Assert.assertTrue(supportedCapabilitiesResult.containsAll(this.supportedCap));
314             return bgpRib;
315         });
316
317         this.bgpRibStates.clear();
318         checkNotPresentOperational(getDataBroker(), this.bgpInstanceIdentifier);
319
320         stateProvider.close();
321     }
322
323     @Test
324     public void testInactiveStateProvider() throws Exception {
325         doReturn(false).when(this.bgpRibState).isActive();
326         doReturn(false).when(this.bgpPeerState).isActive();
327
328         final StateProviderImpl stateProvider = new StateProviderImpl(getDataBroker(), 1, this.tableTypeRegistry,
329             this.stateCollector, "global-bgp");
330         stateProvider.init();
331
332         this.bgpRibStates.add(this.bgpRibState);
333         checkNotPresentOperational(getDataBroker(), this.bgpInstanceIdentifier);
334
335         this.bgpPeerStates.add(this.bgpPeerState);
336         checkNotPresentOperational(getDataBroker(), this.bgpInstanceIdentifier);
337
338         this.bgpRibStates.clear();
339         checkNotPresentOperational(getDataBroker(), this.bgpInstanceIdentifier);
340
341         stateProvider.close();
342     }
343
344     private static BgpNeighborStateAugmentation buildBgpNeighborStateAugmentation() {
345         final BgpNeighborStateAugmentation augmentation = new BgpNeighborStateAugmentationBuilder()
346                 .setMessages(new MessagesBuilder().setReceived(new ReceivedBuilder()
347                         .setNOTIFICATION(BigInteger.ONE).setUPDATE(BigInteger.ONE).build())
348                         .setSent(new SentBuilder().setNOTIFICATION(BigInteger.ONE).setUPDATE(BigInteger.ONE).build())
349                         .build()).build();
350         return augmentation;
351     }
352
353     private static AfiSafis buildAfiSafis() {
354         final NeighborAfiSafiStateAugmentationBuilder neighborAfiSafiStateAugmentation =
355                 new NeighborAfiSafiStateAugmentationBuilder().setActive(true).setPrefixes(
356                         new PrefixesBuilder().setSent(1L).setReceived(2L).setInstalled(1L).build());
357         final AfiSafi afiSafi = new AfiSafiBuilder()
358                 .setAfiSafiName(IPV4UNICAST.class)
359                 .setGracefulRestart(new GracefulRestartBuilder().setState(new StateBuilder().setEnabled(false)
360                         .addAugmentation(NeighborAfiSafiGracefulRestartStateAugmentation.class,
361                                 new NeighborAfiSafiGracefulRestartStateAugmentationBuilder()
362                                         .setAdvertised(true).setReceived(true).build())
363                         .build()).build())
364                 .setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp
365                         .common.afi.safi.list.afi.safi.StateBuilder().setEnabled(false).addAugmentation(
366                                 NeighborAfiSafiStateAugmentation.class, neighborAfiSafiStateAugmentation.build())
367                         .build())
368                 .build();
369
370         return new AfiSafisBuilder().setAfiSafi(Collections.singletonList(afiSafi)).build();
371     }
372
373     private static ErrorHandling buildErrorHandling() {
374         final ErrorHandling errorHandling = new ErrorHandlingBuilder().setState(
375                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.error
376                         .handling.StateBuilder().setTreatAsWithdraw(false)
377                         .addAugmentation(NeighborErrorHandlingStateAugmentation.class,
378                                 new NeighborErrorHandlingStateAugmentationBuilder()
379                                         .setErroneousUpdateMessages(1L).build()).build()).build();
380         return errorHandling;
381     }
382
383     private static Timers buildTimers() {
384         final Timers timers = new TimersBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang
385                 .bgp.rev151009.bgp.neighbor.group.timers.StateBuilder()
386                 .setConnectRetry(BigDecimal.valueOf(30))
387                 .setHoldTime(BigDecimal.valueOf(90))
388                 .setKeepaliveInterval(BigDecimal.valueOf(30))
389                 .setMinimumAdvertisementInterval(BigDecimal.valueOf(30))
390                 .addAugmentation(NeighborTimersStateAugmentation.class, new NeighborTimersStateAugmentationBuilder()
391                         .setNegotiatedHoldTime(BigDecimal.TEN).setUptime(new Timeticks(1L)).build())
392                 .build()).build();
393         return timers;
394     }
395
396     private Transport buildTransport() {
397         final Transport transport = new TransportBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig
398                 .net.yang.bgp.rev151009.bgp.neighbor.group.transport.StateBuilder()
399                 .setMtuDiscovery(false)
400                 .setPassiveMode(false)
401                 .addAugmentation(NeighborTransportStateAugmentation.class,
402                         new NeighborTransportStateAugmentationBuilder().setLocalPort(this.localPort)
403                                 .setRemotePort(this.remotePort)
404                                 .setRemoteAddress(this.neighborAddress).build())
405                 .build()).build();
406         return transport;
407     }
408
409     private GracefulRestart buildGracefulRestart() {
410         final NeighborGracefulRestartStateAugmentationBuilder gracefulAugmentation
411                 = new NeighborGracefulRestartStateAugmentationBuilder();
412         gracefulAugmentation.setPeerRestarting(false);
413         gracefulAugmentation.setLocalRestarting(false);
414         gracefulAugmentation.setPeerRestartTime(0);
415         gracefulAugmentation.setLocalRestarting(true)
416                 .setPeerRestarting(true).setPeerRestartTime(this.restartTime);
417         final GracefulRestart gracefulRestart = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
418                 .rev151009.bgp.graceful.restart.GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http
419                 .openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.graceful.restart.StateBuilder()
420                 .addAugmentation(NeighborGracefulRestartStateAugmentation.class,
421                         gracefulAugmentation.build()).build()).build();
422         return gracefulRestart;
423     }
424
425     private Global buildGlobalExpected(final long prefixesAndPaths) {
426         return new GlobalBuilder()
427                 .setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base
428                         .StateBuilder().setRouterId(new Ipv4Address(this.bgpId.getValue()))
429                         .setTotalPrefixes(prefixesAndPaths).setTotalPaths(prefixesAndPaths).setAs(this.as).build())
430                 .setAfiSafis(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base
431                         .AfiSafisBuilder().setAfiSafi(Collections.singletonList(new AfiSafiBuilder()
432                         .setAfiSafiName(IPV4UNICAST.class).setState(new org.opendaylight.yang.gen.v1.http.openconfig
433                                 .net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.StateBuilder()
434                                 .setEnabled(false)
435                                 .addAugmentation(GlobalAfiSafiStateAugmentation.class,
436                                         new GlobalAfiSafiStateAugmentationBuilder()
437                                                 .setTotalPaths(prefixesAndPaths).setTotalPrefixes(prefixesAndPaths)
438                                                 .build()).build()).build()))
439                         .build()).build();
440     }
441
442     private static PeerGroup buildGroupExpected() {
443         return new PeerGroupBuilder().setPeerGroupName("test-group").setState(new org.opendaylight.yang.gen.v1.http
444             .openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.StateBuilder()
445             .setSendCommunity(CommunityType.NONE)
446             .setRouteFlapDamping(false)
447             .addAugmentation(PeerGroupStateAugmentation.class,
448                 new PeerGroupStateAugmentationBuilder().setTotalPaths(1L).setTotalPrefixes(1L)
449                     .build()).build())
450             .build();
451     }
452 }