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.rev100924.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.BgpTableType;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
51 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;
52 import org.opendaylight.yangtools.yang.binding.DataObject;
53 import org.opendaylight.yangtools.yang.binding.Notification;
55 public class SimpleRegistryTest {
57 private static final MultiPathSupport ADD_PATH_SUPPORT = new MultiPathSupport() {
59 public boolean isTableTypeSupported(final BgpTableType tableType) {
64 private static final PeerSpecificParserConstraint CONSTRAINT = new PeerSpecificParserConstraint() {
66 public <T extends PeerConstraint> Optional<T> getPeerConstraint(final Class<T> peerConstraintType) {
67 return (Optional<T>) Optional.of(ADD_PATH_SUPPORT);
71 protected BGPExtensionProviderContext ctx;
72 private BgpTestActivator activator;
76 this.ctx = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance();
77 this.activator = new BgpTestActivator();
78 this.activator.start(this.ctx);
82 public void tearDown() {
83 this.activator.close();
87 public void testSimpleAttribute() throws BGPDocumentedException, BGPParsingException {
88 final AttributeRegistry attrReg = this.ctx.getAttributeRegistry();
89 final byte[] attributeBytes = {
92 final ByteBuf byteAggregator = Unpooled.buffer(attributeBytes.length);
93 attrReg.serializeAttribute(Mockito.mock(DataObject.class), byteAggregator);
94 attrReg.parseAttributes(Unpooled.wrappedBuffer(attributeBytes), CONSTRAINT);
95 verify(this.activator.attrParser, times(1)).parseAttribute(Mockito.any(ByteBuf.class), Mockito.any(AttributesBuilder.class),
96 Mockito.any(PeerSpecificParserConstraint.class));
97 verify(this.activator.attrSerializer, times(1)).serializeAttribute(Mockito.any(DataObject.class), Mockito.any(ByteBuf.class));
101 public void testSimpleParameter() throws Exception {
102 final ParameterRegistry paramReg = this.ctx.getParameterRegistry();
103 final BgpParameters param = Mockito.mock(BgpParameters.class);
104 Mockito.doReturn(BgpParameters.class).when(param).getImplementedInterface();
105 final byte[] paramBytes = {
108 final ByteBuf buffer = Unpooled.buffer(paramBytes.length);
109 paramReg.serializeParameter(param, buffer);
110 paramReg.parseParameter(0, Unpooled.wrappedBuffer(paramBytes));
111 verify(this.activator.paramParser, times(1)).parseParameter(Mockito.any(ByteBuf.class));
112 verify(this.activator.paramSerializer, times(1)).serializeParameter(Mockito.any(BgpParameters.class), Mockito.any(ByteBuf.class));
116 public void testSimpleCapability() throws Exception {
117 final CapabilityRegistry capaRegistry = this.ctx.getCapabilityRegistry();
118 final byte[] capabilityBytes = {
121 capaRegistry.parseCapability(BgpTestActivator.TYPE, Unpooled.wrappedBuffer(capabilityBytes));
122 verify(this.activator.capaParser, times(1)).parseCapability(Mockito.any(ByteBuf.class));
126 public void testSimpleBgpPrefixSidTlvRegistry() {
127 final BgpPrefixSidTlvRegistry sidTlvReg = this.ctx.getBgpPrefixSidTlvRegistry();
128 final byte[] tlvBytes = {
129 0x00, 0x03, 0x00, 0x00, 0x00
132 final BgpPrefixSidTlv tlv = mock(BgpPrefixSidTlv.class);
133 doReturn(BgpPrefixSidTlv.class).when(tlv).getImplementedInterface();
135 final ByteBuf buffer = Unpooled.buffer(tlvBytes.length);
136 sidTlvReg.serializeBgpPrefixSidTlv(tlv, buffer);
137 verify(this.activator.sidTlvSerializer, times(1)).serializeBgpPrefixSidTlv(Mockito.any(BgpPrefixSidTlv.class), Mockito.any(ByteBuf.class));
139 sidTlvReg.parseBgpPrefixSidTlv(BgpTestActivator.TYPE, Unpooled.wrappedBuffer(tlvBytes));
140 verify(this.activator.sidTlvParser, times(1)).parseBgpPrefixSidTlv(Mockito.any(ByteBuf.class));
144 public void testSimpleMessageRegistry() throws Exception {
145 final MessageRegistry msgRegistry = this.ctx.getMessageRegistry();
147 final byte[] msgBytes = {
148 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
149 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
150 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
151 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
152 (byte) 0x00, (byte) 0x13, (byte) 0x00
154 final Notification msg = mock(Notification.class);
155 doReturn(Notification.class).when(msg).getImplementedInterface();
157 final ByteBuf buffer = Unpooled.buffer(msgBytes.length);
158 msgRegistry.serializeMessage(msg, buffer);
159 msgRegistry.parseMessage(Unpooled.wrappedBuffer(msgBytes), CONSTRAINT);
160 verify(this.activator.msgParser, times(1)).parseMessageBody(Mockito.any(ByteBuf.class), Mockito.anyInt(),
161 Mockito.any(PeerSpecificParserConstraint.class));
162 verify(this.activator.msgSerializer, times(1)).serializeMessage(Mockito.any(Notification.class), Mockito.any(ByteBuf.class));
166 public void testAfiRegistry() throws Exception {
167 final AddressFamilyRegistry afiRegistry = this.ctx.getAddressFamilyRegistry();
168 assertEquals(Ipv4AddressFamily.class, afiRegistry.classForFamily(1));
169 assertEquals(1, afiRegistry.numberForClass(Ipv4AddressFamily.class).intValue());
173 public void testSafiRegistry() throws Exception {
174 final SubsequentAddressFamilyRegistry safiRegistry = this.ctx.getSubsequentAddressFamilyRegistry();
175 assertEquals(UnicastSubsequentAddressFamily.class, safiRegistry.classForFamily(1));
176 assertEquals(1, safiRegistry.numberForClass(UnicastSubsequentAddressFamily.class).intValue());
180 public void testMpReachParser() throws BGPParsingException {
181 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
182 final byte[] mpReachBytes = {
183 0x00, 0x01, 0x01, 0x04, 0x7f, 0x00, 0x00, 0x01, 0x00
185 final MpReachNlri mpReach = new MpReachNlriBuilder()
186 .setAfi(Ipv4AddressFamily.class)
187 .setSafi(UnicastSubsequentAddressFamily.class)
188 .setCNextHop(new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("127.0.0.1")).build()).build())
190 final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
191 nlriReg.serializeMpReach(mpReach, buffer);
192 assertArrayEquals(mpReachBytes, buffer.array());
193 assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes), CONSTRAINT));
194 verify(this.activator.nlriParser, times(1)).parseNlri(Mockito.any(ByteBuf.class), Mockito.any(MpReachNlriBuilder.class), Mockito.any());
198 public void testMpReachWithZeroNextHop() throws BGPParsingException {
199 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
200 final byte[] mpReachBytes = {
201 0x00, 0x01, 0x01, 0x00, 0x00
203 final MpReachNlri mpReach = new MpReachNlriBuilder()
204 .setAfi(Ipv4AddressFamily.class)
205 .setSafi(UnicastSubsequentAddressFamily.class)
207 final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
208 nlriReg.serializeMpReach(mpReach, buffer);
209 assertArrayEquals(mpReachBytes, buffer.array());
210 assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes), CONSTRAINT));
214 public void testMpReachIpv6() throws BGPParsingException {
215 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
216 final byte[] mpReachBytes = {
217 0x00, 0x02, 0x01, 0x00, 0x00
219 final MpReachNlri mpReach = new MpReachNlriBuilder()
220 .setAfi(Ipv6AddressFamily.class)
221 .setSafi(UnicastSubsequentAddressFamily.class)
223 final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
224 nlriReg.serializeMpReach(mpReach, buffer);
225 assertArrayEquals(mpReachBytes, buffer.array());
226 assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes), CONSTRAINT));
230 public void testMpUnReachParser() throws BGPParsingException {
231 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
232 final byte[] mpUnreachBytes = {
235 final MpUnreachNlri mpUnreach = new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build();
236 final ByteBuf buffer = Unpooled.buffer(mpUnreachBytes.length);
237 nlriReg.serializeMpUnReach(mpUnreach, buffer);
238 assertArrayEquals(mpUnreachBytes, buffer.array());
239 assertEquals(mpUnreach, nlriReg.parseMpUnreach(Unpooled.wrappedBuffer(mpUnreachBytes), CONSTRAINT));
240 verify(this.activator.nlriParser, times(1)).parseNlri(Mockito.any(ByteBuf.class), Mockito.any(MpUnreachNlriBuilder.class), Mockito.any());