2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.protocol.bgp.rib.impl;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertSame;
13 import static org.junit.Assert.fail;
14 import com.google.common.collect.Lists;
15 import java.net.InetSocketAddress;
16 import java.util.Collections;
17 import java.util.List;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.mockito.Mockito;
21 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
22 import org.opendaylight.protocol.bgp.parser.BGPError;
23 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
24 import org.opendaylight.protocol.bgp.rib.spi.BGPSessionListener;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Open;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.OpenBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParametersBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.OptionalCapabilitiesBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapabilityBuilder;
37 public class StrictBGPPeerRegistryTest {
39 private static final AsNumber LOCAL_AS = new AsNumber(1234L);
40 private static final AsNumber REMOTE_AS = new AsNumber(1235L);
41 private static final Ipv4Address FROM = new Ipv4Address("0.0.0.1");
42 private static final IpAddress REMOTE_IP = new IpAddress(FROM);
43 private static final Ipv4Address TO = new Ipv4Address("255.255.255.255");
45 private final BGPSessionListener peer1 = getMockSession();
46 private final Open classicOpen = createOpen(TO, LOCAL_AS);
47 private StrictBGPPeerRegistry peerRegistry;
48 private BGPSessionPreferences mockPreferences;
50 private Open createOpen(final Ipv4Address bgpId, final AsNumber as) {
51 final List<BgpParameters> params = Lists.newArrayList(new BgpParametersBuilder()
52 .setOptionalCapabilities(Lists.newArrayList(new OptionalCapabilitiesBuilder()
53 .setCParameters(new CParametersBuilder()
54 .setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(as).build())
55 .setBgpExtendedMessageCapability(new BgpExtendedMessageCapabilityBuilder().build()).build()).build())).build());
56 return new OpenBuilder().setBgpIdentifier(bgpId).setBgpParameters(params).build();
60 public void setUp() throws Exception {
61 this.peerRegistry = new StrictBGPPeerRegistry();
62 this.mockPreferences = new BGPSessionPreferences(LOCAL_AS, 1, new Ipv4Address("0.0.0.1"), LOCAL_AS, Collections.<BgpParameters> emptyList());
65 private static BGPSessionListener getMockSession() {
66 final BGPSessionListener mock = Mockito.mock(BGPSessionListener.class);
67 Mockito.doNothing().when(mock).releaseConnection();
72 public void testIpAddressConstruction() throws Exception {
73 final InetSocketAddress adr = new InetSocketAddress("127.0.0.1", 179);
74 final IpAddress ipAdr = StrictBGPPeerRegistry.getIpAddress(adr);
75 assertEquals("127.0.0.1", ipAdr.getIpv4Address().getValue());
79 public void testDuplicatePeerConnection() throws Exception {
80 this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
81 this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
83 this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
84 } catch (final BGPDocumentedException e) {
85 assertEquals(BGPError.CEASE, e.getError());
88 fail("Same peer cannot be connected twice");
92 public void testPeerNotConfigured() throws Exception {
94 this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
95 } catch (final IllegalStateException e) {
98 fail("Unknown peer cannot be connected");
102 public void testPeerConnectionSuccessfull() throws Exception {
103 final Ipv4Address to2 = new Ipv4Address("255.255.255.254");
104 final IpAddress remoteIp2 = new IpAddress(to2);
106 this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
107 final BGPSessionListener session2 = getMockSession();
108 this.peerRegistry.addPeer(remoteIp2, session2, this.mockPreferences);
110 final BGPSessionListener returnedSession1 = this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
111 assertSame(this.peer1, returnedSession1);
112 final BGPSessionListener returnedSession2 = this.peerRegistry.getPeer(remoteIp2, FROM, to2, this.classicOpen);
113 assertSame(session2, returnedSession2);
115 Mockito.verifyZeroInteractions(this.peer1);
116 Mockito.verifyZeroInteractions(session2);
120 public void testDropSecondPeer() throws Exception {
121 final Ipv4Address higher = new Ipv4Address("192.168.200.200");
122 final Ipv4Address lower = new Ipv4Address("10.10.10.10");
123 final IpAddress remoteIp = new IpAddress(lower);
125 this.peerRegistry.addPeer(remoteIp, this.peer1, this.mockPreferences);
127 this.peerRegistry.getPeer(remoteIp, higher, lower, createOpen(lower, LOCAL_AS));
129 this.peerRegistry.getPeer(remoteIp, lower, higher, createOpen(higher, LOCAL_AS));
130 } catch (final BGPDocumentedException e) {
131 assertEquals(BGPError.CEASE, e.getError());
134 fail("Same peer cannot be connected twice");
138 public void testDropFirstPeer() throws Exception {
139 final Ipv4Address higher = new Ipv4Address("123.123.123.123");
140 final Ipv4Address lower = new Ipv4Address("123.123.123.122");
141 final IpAddress remoteIp = new IpAddress(lower);
143 this.peerRegistry.addPeer(remoteIp, this.peer1, this.mockPreferences);
145 this.peerRegistry.getPeer(remoteIp, lower, higher, createOpen(higher, LOCAL_AS));
146 this.peerRegistry.getPeer(remoteIp, higher, lower, createOpen(lower, LOCAL_AS));
147 Mockito.verify(this.peer1).releaseConnection();
151 public void testDuplicatePeersWDifferentIds() throws Exception {
152 this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
154 this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
156 this.peerRegistry.getPeer(REMOTE_IP, TO, TO, this.classicOpen);
157 } catch (final BGPDocumentedException e) {
158 assertEquals(BGPError.CEASE, e.getError());
161 fail("Same peer cannot be connected twice");
165 public void testDuplicatePeersHigherAs() throws Exception {
166 this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
168 this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
169 this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, createOpen(TO, REMOTE_AS));
170 Mockito.verify(this.peer1).releaseConnection();
174 public void testDuplicatePeersLowerAs() throws Exception {
175 final AsNumber as2 = new AsNumber(3L);
177 this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
179 this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, this.classicOpen);
181 this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, createOpen(TO, as2));
182 } catch (final BGPDocumentedException e) {
183 assertEquals(BGPError.CEASE, e.getError());
186 fail("Same peer cannot be connected twice");
190 public void testAsMismatch() throws Exception {
191 final AsNumber as2 = new AsNumber(3L);
193 this.peerRegistry.addPeer(REMOTE_IP, this.peer1, this.mockPreferences);
195 this.peerRegistry.getPeer(REMOTE_IP, FROM, TO, createOpen(TO, as2));
196 } catch (final BGPDocumentedException e) {
197 assertEquals(BGPError.BAD_PEER_AS, e.getError());
200 fail("Peer AS number mismatch");