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.parser.spi.pojo;
11 import static org.junit.Assert.assertArrayEquals;
12 import static org.junit.Assert.assertEquals;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verify;
17 import io.netty.buffer.ByteBuf;
18 import io.netty.buffer.Unpooled;
19 import java.util.Optional;
20 import org.junit.After;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.mockito.Mockito;
24 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
25 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
26 import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
27 import org.opendaylight.protocol.bgp.parser.spi.AttributeRegistry;
28 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
29 import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvRegistry;
30 import org.opendaylight.protocol.bgp.parser.spi.CapabilityRegistry;
31 import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
32 import org.opendaylight.protocol.bgp.parser.spi.MultiPathSupport;
33 import org.opendaylight.protocol.bgp.parser.spi.NlriRegistry;
34 import org.opendaylight.protocol.bgp.parser.spi.ParameterRegistry;
35 import org.opendaylight.protocol.bgp.parser.spi.PeerConstraint;
36 import org.opendaylight.protocol.bgp.parser.spi.PeerSpecificParserConstraint;
37 import org.opendaylight.protocol.bgp.parser.spi.SubsequentAddressFamilyRegistry;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
51 import org.opendaylight.yangtools.yang.binding.DataObject;
52 import org.opendaylight.yangtools.yang.binding.Notification;
54 public class SimpleRegistryTest {
56 private static final MultiPathSupport ADD_PATH_SUPPORT = tableType -> true;
58 private static final PeerSpecificParserConstraint CONSTRAINT = new PeerSpecificParserConstraint() {
60 public <T extends PeerConstraint> Optional<T> getPeerConstraint(final Class<T> peerConstraintType) {
61 return (Optional<T>) Optional.of(ADD_PATH_SUPPORT);
65 protected BGPExtensionProviderContext ctx;
66 private BgpTestActivator activator;
70 this.ctx = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance();
71 this.activator = new BgpTestActivator();
72 this.activator.start(this.ctx);
76 public void tearDown() {
77 this.activator.close();
81 public void testSimpleAttribute() throws BGPDocumentedException, BGPParsingException {
82 final AttributeRegistry attrReg = this.ctx.getAttributeRegistry();
83 final byte[] attributeBytes = {
86 final ByteBuf byteAggregator = Unpooled.buffer(attributeBytes.length);
87 attrReg.serializeAttribute(Mockito.mock(DataObject.class), byteAggregator);
88 attrReg.parseAttributes(Unpooled.wrappedBuffer(attributeBytes), CONSTRAINT);
89 verify(this.activator.attrParser, times(1)).parseAttribute(Mockito.any(ByteBuf.class), Mockito.any(AttributesBuilder.class),
90 Mockito.any(PeerSpecificParserConstraint.class));
91 verify(this.activator.attrSerializer, times(1)).serializeAttribute(Mockito.any(DataObject.class), Mockito.any(ByteBuf.class));
95 public void testSimpleParameter() throws Exception {
96 final ParameterRegistry paramReg = this.ctx.getParameterRegistry();
97 final BgpParameters param = Mockito.mock(BgpParameters.class);
98 Mockito.doReturn(BgpParameters.class).when(param).getImplementedInterface();
99 final byte[] paramBytes = {
102 final ByteBuf buffer = Unpooled.buffer(paramBytes.length);
103 paramReg.serializeParameter(param, buffer);
104 paramReg.parseParameter(0, Unpooled.wrappedBuffer(paramBytes));
105 verify(this.activator.paramParser, times(1)).parseParameter(Mockito.any(ByteBuf.class));
106 verify(this.activator.paramSerializer, times(1)).serializeParameter(Mockito.any(BgpParameters.class), Mockito.any(ByteBuf.class));
110 public void testSimpleCapability() throws Exception {
111 final CapabilityRegistry capaRegistry = this.ctx.getCapabilityRegistry();
112 final byte[] capabilityBytes = {
115 capaRegistry.parseCapability(BgpTestActivator.TYPE, Unpooled.wrappedBuffer(capabilityBytes));
116 verify(this.activator.capaParser, times(1)).parseCapability(Mockito.any(ByteBuf.class));
120 public void testSimpleBgpPrefixSidTlvRegistry() {
121 final BgpPrefixSidTlvRegistry sidTlvReg = this.ctx.getBgpPrefixSidTlvRegistry();
122 final byte[] tlvBytes = {
123 0x00, 0x03, 0x00, 0x00, 0x00
126 final BgpPrefixSidTlv tlv = mock(BgpPrefixSidTlv.class);
127 doReturn(BgpPrefixSidTlv.class).when(tlv).getImplementedInterface();
129 final ByteBuf buffer = Unpooled.buffer(tlvBytes.length);
130 sidTlvReg.serializeBgpPrefixSidTlv(tlv, buffer);
131 verify(this.activator.sidTlvSerializer, times(1)).serializeBgpPrefixSidTlv(Mockito.any(BgpPrefixSidTlv.class), Mockito.any(ByteBuf.class));
133 sidTlvReg.parseBgpPrefixSidTlv(BgpTestActivator.TYPE, Unpooled.wrappedBuffer(tlvBytes));
134 verify(this.activator.sidTlvParser, times(1)).parseBgpPrefixSidTlv(Mockito.any(ByteBuf.class));
138 public void testSimpleMessageRegistry() throws Exception {
139 final MessageRegistry msgRegistry = this.ctx.getMessageRegistry();
141 final byte[] msgBytes = {
142 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
143 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
144 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
145 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
146 (byte) 0x00, (byte) 0x13, (byte) 0x00
148 final Notification msg = mock(Notification.class);
149 doReturn(Notification.class).when(msg).getImplementedInterface();
151 final ByteBuf buffer = Unpooled.buffer(msgBytes.length);
152 msgRegistry.serializeMessage(msg, buffer);
153 msgRegistry.parseMessage(Unpooled.wrappedBuffer(msgBytes), CONSTRAINT);
154 verify(this.activator.msgParser, times(1)).parseMessageBody(Mockito.any(ByteBuf.class), Mockito.anyInt(),
155 Mockito.any(PeerSpecificParserConstraint.class));
156 verify(this.activator.msgSerializer, times(1)).serializeMessage(Mockito.any(Notification.class), Mockito.any(ByteBuf.class));
160 public void testAfiRegistry() throws Exception {
161 final AddressFamilyRegistry afiRegistry = this.ctx.getAddressFamilyRegistry();
162 assertEquals(Ipv4AddressFamily.class, afiRegistry.classForFamily(1));
163 assertEquals(1, afiRegistry.numberForClass(Ipv4AddressFamily.class).intValue());
167 public void testSafiRegistry() throws Exception {
168 final SubsequentAddressFamilyRegistry safiRegistry = this.ctx.getSubsequentAddressFamilyRegistry();
169 assertEquals(UnicastSubsequentAddressFamily.class, safiRegistry.classForFamily(1));
170 assertEquals(1, safiRegistry.numberForClass(UnicastSubsequentAddressFamily.class).intValue());
174 public void testMpReachParser() throws BGPParsingException {
175 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
176 final byte[] mpReachBytes = {
177 0x00, 0x01, 0x01, 0x04, 0x7f, 0x00, 0x00, 0x01, 0x00
179 final MpReachNlri mpReach = new MpReachNlriBuilder()
180 .setAfi(Ipv4AddressFamily.class)
181 .setSafi(UnicastSubsequentAddressFamily.class)
182 .setCNextHop(new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("127.0.0.1")).build()).build())
184 final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
185 nlriReg.serializeMpReach(mpReach, buffer);
186 assertArrayEquals(mpReachBytes, buffer.array());
187 assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes), CONSTRAINT));
188 verify(this.activator.nlriParser, times(1)).parseNlri(Mockito.any(ByteBuf.class), Mockito.any(MpReachNlriBuilder.class), Mockito.any());
192 public void testMpReachWithZeroNextHop() throws BGPParsingException {
193 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
194 final byte[] mpReachBytes = {
195 0x00, 0x01, 0x01, 0x00, 0x00
197 final MpReachNlri mpReach = new MpReachNlriBuilder()
198 .setAfi(Ipv4AddressFamily.class)
199 .setSafi(UnicastSubsequentAddressFamily.class)
201 final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
202 nlriReg.serializeMpReach(mpReach, buffer);
203 assertArrayEquals(mpReachBytes, buffer.array());
204 assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes), CONSTRAINT));
208 public void testMpReachIpv6() throws BGPParsingException {
209 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
210 final byte[] mpReachBytes = {
211 0x00, 0x02, 0x01, 0x00, 0x00
213 final MpReachNlri mpReach = new MpReachNlriBuilder()
214 .setAfi(Ipv6AddressFamily.class)
215 .setSafi(UnicastSubsequentAddressFamily.class)
217 final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
218 nlriReg.serializeMpReach(mpReach, buffer);
219 assertArrayEquals(mpReachBytes, buffer.array());
220 assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes), CONSTRAINT));
224 public void testMpUnReachParser() throws BGPParsingException {
225 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
226 final byte[] mpUnreachBytes = {
229 final MpUnreachNlri mpUnreach = new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build();
230 final ByteBuf buffer = Unpooled.buffer(mpUnreachBytes.length);
231 nlriReg.serializeMpUnReach(mpUnreach, buffer);
232 assertArrayEquals(mpUnreachBytes, buffer.array());
233 assertEquals(mpUnreach, nlriReg.parseMpUnreach(Unpooled.wrappedBuffer(mpUnreachBytes), CONSTRAINT));
234 verify(this.activator.nlriParser, times(1)).parseNlri(Mockito.any(ByteBuf.class), Mockito.any(MpUnreachNlriBuilder.class), Mockito.any());