Mass-convert all compontents to use -no-zone addresses
[bgpcep.git] / bgp / rib-impl / src / test / java / org / opendaylight / protocol / bgp / rib / impl / StrictBGPPeerRegistryTest.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.assertSame;
12 import static org.junit.Assert.fail;
13
14 import com.google.common.collect.Lists;
15 import com.google.common.util.concurrent.Futures;
16 import java.net.InetSocketAddress;
17 import java.util.Collections;
18 import java.util.List;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.mockito.Mockito;
22 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
23 import org.opendaylight.protocol.bgp.parser.BGPError;
24 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
25 import org.opendaylight.protocol.bgp.rib.impl.spi.PeerRegistrySessionListener;
26 import org.opendaylight.protocol.bgp.rib.spi.BGPSessionListener;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.Open;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.OpenBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.BgpParameters;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.BgpParametersBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.OptionalCapabilitiesBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.BgpId;
38 import org.opendaylight.yangtools.concepts.Registration;
39 import org.opendaylight.yangtools.yang.common.Uint32;
40
41 public class StrictBGPPeerRegistryTest {
42
43     private static final AsNumber LOCAL_AS = new AsNumber(Uint32.valueOf(1234));
44     private static final AsNumber REMOTE_AS = new AsNumber(Uint32.valueOf(1235));
45     private static final Ipv4AddressNoZone FROM = new Ipv4AddressNoZone("0.0.0.1");
46     private static final IpAddressNoZone REMOTE_IP = new IpAddressNoZone(FROM);
47     private static final Ipv4AddressNoZone TO = new Ipv4AddressNoZone("255.255.255.255");
48
49     private final BGPSessionListener peer1 = getMockSession();
50     private final Open classicOpen = createOpen(TO, LOCAL_AS);
51     private StrictBGPPeerRegistry peerRegistry;
52     private BGPSessionPreferences mockPreferences;
53
54     private static Open createOpen(final Ipv4AddressNoZone bgpId, final AsNumber as) {
55         final List<BgpParameters> params = Lists.newArrayList(new BgpParametersBuilder()
56             .setOptionalCapabilities(Lists.newArrayList(new OptionalCapabilitiesBuilder()
57                 .setCParameters(new CParametersBuilder()
58                     .setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(as).build())
59                     .build()).build())).build());
60         return new OpenBuilder().setBgpIdentifier(bgpId).setBgpParameters(params).build();
61     }
62
63     @Before
64     public void setUp() {
65         this.peerRegistry = new StrictBGPPeerRegistry();
66         this.mockPreferences = new BGPSessionPreferences(LOCAL_AS, 1, new BgpId("0.0.0.1"), LOCAL_AS,
67                 Collections.emptyList());
68     }
69
70     private static BGPSessionListener getMockSession() {
71         final BGPSessionListener mock = Mockito.mock(BGPSessionListener.class);
72         Mockito.doReturn(Futures.immediateFuture(null)).when(mock).releaseConnection();
73         return mock;
74     }
75
76     private static PeerRegistrySessionListener getMockSessionListener() {
77         final PeerRegistrySessionListener mock = Mockito.mock(PeerRegistrySessionListener.class);
78         Mockito.doNothing().when(mock).onSessionCreated(Mockito.any(IpAddressNoZone.class));
79         Mockito.doNothing().when(mock).onSessionRemoved(Mockito.any(IpAddressNoZone.class));
80         return mock;
81     }
82
83     @Test
84     public void testIpAddressConstruction() throws BGPDocumentedException {
85         final InetSocketAddress adr = new InetSocketAddress("127.0.0.1", 179);
86         final IpAddressNoZone ipAdr = StrictBGPPeerRegistry.getIpAddress(adr);
87         assertEquals("127.0.0.1", ipAdr.getIpv4AddressNoZone().getValue());
88     }
89
90     @Test
91     public void testDuplicatePeerConnection() throws BGPDocumentedException {
92         this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
93         this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
94         try {
95             this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
96         } catch (final BGPDocumentedException e) {
97             assertEquals(BGPError.CEASE, e.getError());
98             return;
99         }
100         fail("Same peer cannot be connected twice");
101     }
102
103     @Test
104     public void testPeerNotConfigured() throws BGPDocumentedException {
105         try {
106             this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
107         } catch (final IllegalStateException e) {
108             return;
109         }
110         fail("Unknown peer cannot be connected");
111     }
112
113     @Test
114     public void testPeerConnectionSuccessfull() throws Exception {
115         final Ipv4AddressNoZone to2 = new Ipv4AddressNoZone("255.255.255.254");
116         final IpAddressNoZone remoteIp2 = new IpAddressNoZone(to2);
117
118         this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
119         final BGPSessionListener session2 = getMockSession();
120         this.peerRegistry.addPeer(remoteIp2, session2, this.mockPreferences);
121
122         final BGPSessionListener returnedSession1 = this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
123         assertSame(this.peer1, returnedSession1);
124         final BGPSessionListener returnedSession2 = this.peerRegistry.getPeer(remoteIp2, FROM, to2, this.classicOpen);
125         assertSame(session2, returnedSession2);
126
127         Mockito.verifyZeroInteractions(this.peer1);
128         Mockito.verifyZeroInteractions(session2);
129     }
130
131     @Test
132     public void testDropSecondPeer() throws BGPDocumentedException {
133         final Ipv4AddressNoZone higher = new Ipv4AddressNoZone("192.168.200.200");
134         final Ipv4AddressNoZone lower = new Ipv4AddressNoZone("10.10.10.10");
135         final IpAddressNoZone remoteIp = new IpAddressNoZone(lower);
136
137         this.peerRegistry.addPeer(remoteIp, this.peer1, this.mockPreferences);
138
139         this.peerRegistry.getPeer(remoteIp, higher, lower, createOpen(lower, LOCAL_AS));
140         try {
141             this.peerRegistry.getPeer(remoteIp, lower, higher, createOpen(higher, LOCAL_AS));
142         } catch (final BGPDocumentedException e) {
143             assertEquals(BGPError.CEASE, e.getError());
144             return;
145         }
146         fail("Same peer cannot be connected twice");
147     }
148
149     @Test
150     public void testDropFirstPeer() throws Exception {
151         final Ipv4AddressNoZone higher = new Ipv4AddressNoZone("123.123.123.123");
152         final Ipv4AddressNoZone lower = new Ipv4AddressNoZone("123.123.123.122");
153         final IpAddressNoZone remoteIp = new IpAddressNoZone(lower);
154
155         this.peerRegistry.addPeer(remoteIp, this.peer1, this.mockPreferences);
156
157         this.peerRegistry.getPeer(remoteIp, lower, higher, createOpen(higher, LOCAL_AS));
158         this.peerRegistry.getPeer(remoteIp, higher, lower, createOpen(lower, LOCAL_AS));
159         Mockito.verify(this.peer1).releaseConnection();
160     }
161
162     @Test
163     public void testDuplicatePeersWDifferentIds() throws BGPDocumentedException {
164         this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
165
166         this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
167         try {
168             this.peerRegistry.getPeer(REMOTE_IP, TO, TO, this.classicOpen);
169         } catch (final BGPDocumentedException e) {
170             assertEquals(BGPError.CEASE, e.getError());
171             return;
172         }
173         fail("Same peer cannot be connected twice");
174     }
175
176     @Test
177     public void testDuplicatePeersHigherAs() throws BGPDocumentedException {
178         this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
179
180         this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
181         this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, createOpen(TO, REMOTE_AS));
182         Mockito.verify(this.peer1).releaseConnection();
183     }
184
185     @Test
186     public void testDuplicatePeersLowerAs() throws Exception {
187         final AsNumber as2 = new AsNumber(Uint32.valueOf(3));
188
189         this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
190
191         this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
192         try {
193             this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, createOpen(TO, as2));
194         } catch (final BGPDocumentedException e) {
195             assertEquals(BGPError.CEASE, e.getError());
196             return;
197         }
198         fail("Same peer cannot be connected twice");
199     }
200
201     @Test
202     public void testAsMismatch() {
203         final AsNumber as2 = new AsNumber(Uint32.valueOf(3));
204
205         this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
206         try {
207             this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, createOpen(TO, as2));
208         } catch (final BGPDocumentedException e) {
209             assertEquals(BGPError.BAD_PEER_AS, e.getError());
210             return;
211         }
212         fail("Peer AS number mismatch");
213     }
214
215     @Test
216     public void testRegisterPeerSessionListener() throws Exception {
217         final PeerRegistrySessionListener sessionListener1 = getMockSessionListener();
218         this.peerRegistry.registerPeerSessionListener(sessionListener1);
219
220         final PeerRegistrySessionListener sessionListener2 = getMockSessionListener();
221         this.peerRegistry.registerPeerSessionListener(sessionListener2);
222
223         this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
224         this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
225         Mockito.verify(sessionListener1, Mockito.times(1)).onSessionCreated(REMOTE_IP);
226         Mockito.verify(sessionListener2, Mockito.times(1)).onSessionCreated(REMOTE_IP);
227
228         this.peerRegistry.removePeerSession(REMOTE_IP);
229         Mockito.verify(sessionListener1, Mockito.times(1)).onSessionRemoved(REMOTE_IP);
230         Mockito.verify(sessionListener2, Mockito.times(1)).onSessionRemoved(REMOTE_IP);
231     }
232
233     @Test
234     public void testClosePeerSessionOneListener() throws BGPDocumentedException {
235         final PeerRegistrySessionListener sessionListener1 = getMockSessionListener();
236         final Registration registration1 = this.peerRegistry.registerPeerSessionListener(sessionListener1);
237
238         final PeerRegistrySessionListener sessionListener2 = getMockSessionListener();
239         this.peerRegistry.registerPeerSessionListener(sessionListener2);
240
241         this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
242         this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
243         this.peerRegistry.removePeerSession(REMOTE_IP);
244
245         registration1.close();
246         this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
247         this.peerRegistry.removePeerSession(REMOTE_IP);
248
249         Mockito.verify(sessionListener1, Mockito.times(1)).onSessionCreated(REMOTE_IP);
250         Mockito.verify(sessionListener2, Mockito.times(2)).onSessionCreated(REMOTE_IP);
251         Mockito.verify(sessionListener1, Mockito.times(1)).onSessionRemoved(REMOTE_IP);
252         Mockito.verify(sessionListener2, Mockito.times(2)).onSessionRemoved(REMOTE_IP);
253     }
254 }