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;
18 import io.netty.buffer.ByteBuf;
19 import io.netty.buffer.Unpooled;
20 import java.util.Optional;
21 import org.junit.After;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.mockito.Mockito;
25 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
26 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
27 import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
28 import org.opendaylight.protocol.bgp.parser.spi.AttributeRegistry;
29 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
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.multiprotocol.rev130919.BgpTableType;
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 = new MultiPathSupport() {
58 public boolean isTableTypeSupported(final BgpTableType tableType) {
63 private static final PeerSpecificParserConstraint CONSTRAINT = new PeerSpecificParserConstraint() {
65 public <T extends PeerConstraint> Optional<T> getPeerConstraint(final Class<T> peerConstraintType) {
66 return (Optional<T>) Optional.of(ADD_PATH_SUPPORT);
70 protected BGPExtensionProviderContext ctx;
71 private BgpTestActivator activator;
75 this.ctx = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance();
76 this.activator = new BgpTestActivator();
77 this.activator.start(this.ctx);
81 public void tearDown() {
82 this.activator.close();
86 public void testSimpleAttribute() throws BGPDocumentedException, BGPParsingException {
87 final AttributeRegistry attrReg = this.ctx.getAttributeRegistry();
88 final byte[] attributeBytes = {
91 final ByteBuf byteAggregator = Unpooled.buffer(attributeBytes.length);
92 attrReg.serializeAttribute(Mockito.mock(DataObject.class), byteAggregator);
93 attrReg.parseAttributes(Unpooled.wrappedBuffer(attributeBytes), CONSTRAINT);
94 verify(this.activator.attrParser, times(1)).parseAttribute(Mockito.any(ByteBuf.class), Mockito.any(AttributesBuilder.class),
95 Mockito.any(PeerSpecificParserConstraint.class));
96 verify(this.activator.attrSerializer, times(1)).serializeAttribute(Mockito.any(DataObject.class), Mockito.any(ByteBuf.class));
100 public void testSimpleParameter() throws Exception {
101 final ParameterRegistry paramReg = this.ctx.getParameterRegistry();
102 final BgpParameters param = Mockito.mock(BgpParameters.class);
103 Mockito.doReturn(BgpParameters.class).when(param).getImplementedInterface();
104 final byte[] paramBytes = {
107 final ByteBuf buffer = Unpooled.buffer(paramBytes.length);
108 paramReg.serializeParameter(param, buffer);
109 paramReg.parseParameter(0, Unpooled.wrappedBuffer(paramBytes));
110 verify(this.activator.paramParser, times(1)).parseParameter(Mockito.any(ByteBuf.class));
111 verify(this.activator.paramSerializer, times(1)).serializeParameter(Mockito.any(BgpParameters.class), Mockito.any(ByteBuf.class));
115 public void testSimpleCapability() throws Exception {
116 final CapabilityRegistry capaRegistry = this.ctx.getCapabilityRegistry();
117 final byte[] capabilityBytes = {
120 capaRegistry.parseCapability(BgpTestActivator.TYPE, Unpooled.wrappedBuffer(capabilityBytes));
121 verify(this.activator.capaParser, times(1)).parseCapability(Mockito.any(ByteBuf.class));
125 public void testSimpleMessageRegistry() throws Exception {
126 final MessageRegistry msgRegistry = this.ctx.getMessageRegistry();
128 final byte[] msgBytes = {
129 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
130 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
131 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
132 (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
133 (byte) 0x00, (byte) 0x13, (byte) 0x00
135 final Notification msg = mock(Notification.class);
136 doReturn(Notification.class).when(msg).getImplementedInterface();
138 final ByteBuf buffer = Unpooled.buffer(msgBytes.length);
139 msgRegistry.serializeMessage(msg, buffer);
140 msgRegistry.parseMessage(Unpooled.wrappedBuffer(msgBytes), CONSTRAINT);
141 verify(this.activator.msgParser, times(1)).parseMessageBody(Mockito.any(ByteBuf.class), Mockito.anyInt(),
142 Mockito.any(PeerSpecificParserConstraint.class));
143 verify(this.activator.msgSerializer, times(1)).serializeMessage(Mockito.any(Notification.class), Mockito.any(ByteBuf.class));
147 public void testAfiRegistry() throws Exception {
148 final AddressFamilyRegistry afiRegistry = this.ctx.getAddressFamilyRegistry();
149 assertEquals(Ipv4AddressFamily.class, afiRegistry.classForFamily(1));
150 assertEquals(1, afiRegistry.numberForClass(Ipv4AddressFamily.class).intValue());
154 public void testSafiRegistry() throws Exception {
155 final SubsequentAddressFamilyRegistry safiRegistry = this.ctx.getSubsequentAddressFamilyRegistry();
156 assertEquals(UnicastSubsequentAddressFamily.class, safiRegistry.classForFamily(1));
157 assertEquals(1, safiRegistry.numberForClass(UnicastSubsequentAddressFamily.class).intValue());
161 public void testMpReachParser() throws BGPParsingException {
162 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
163 final byte[] mpReachBytes = {
164 0x00, 0x01, 0x01, 0x04, 0x7f, 0x00, 0x00, 0x01, 0x00
166 final MpReachNlri mpReach = new MpReachNlriBuilder()
167 .setAfi(Ipv4AddressFamily.class)
168 .setSafi(UnicastSubsequentAddressFamily.class)
169 .setCNextHop(new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("127.0.0.1")).build()).build())
171 final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
172 nlriReg.serializeMpReach(mpReach, buffer);
173 assertArrayEquals(mpReachBytes, buffer.array());
174 assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes), CONSTRAINT));
175 verify(this.activator.nlriParser, times(1)).parseNlri(Mockito.any(ByteBuf.class), Mockito.any(MpReachNlriBuilder.class), Mockito.any());
179 public void testMpReachWithZeroNextHop() throws BGPParsingException {
180 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
181 final byte[] mpReachBytes = {
182 0x00, 0x01, 0x01, 0x00, 0x00
184 final MpReachNlri mpReach = new MpReachNlriBuilder()
185 .setAfi(Ipv4AddressFamily.class)
186 .setSafi(UnicastSubsequentAddressFamily.class)
188 final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
189 nlriReg.serializeMpReach(mpReach, buffer);
190 assertArrayEquals(mpReachBytes, buffer.array());
191 assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes), CONSTRAINT));
195 public void testMpReachIpv6() throws BGPParsingException {
196 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
197 final byte[] mpReachBytes = {
198 0x00, 0x02, 0x01, 0x00, 0x00
200 final MpReachNlri mpReach = new MpReachNlriBuilder()
201 .setAfi(Ipv6AddressFamily.class)
202 .setSafi(UnicastSubsequentAddressFamily.class)
204 final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
205 nlriReg.serializeMpReach(mpReach, buffer);
206 assertArrayEquals(mpReachBytes, buffer.array());
207 assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes), CONSTRAINT));
211 public void testMpUnReachParser() throws BGPParsingException {
212 final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
213 final byte[] mpUnreachBytes = {
216 final MpUnreachNlri mpUnreach = new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build();
217 final ByteBuf buffer = Unpooled.buffer(mpUnreachBytes.length);
218 nlriReg.serializeMpUnReach(mpUnreach, buffer);
219 assertArrayEquals(mpUnreachBytes, buffer.array());
220 assertEquals(mpUnreach, nlriReg.parseMpUnreach(Unpooled.wrappedBuffer(mpUnreachBytes), CONSTRAINT));
221 verify(this.activator.nlriParser, times(1)).parseNlri(Mockito.any(ByteBuf.class), Mockito.any(MpUnreachNlriBuilder.class), Mockito.any());