2 * Copyright (c) 2013 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
8 package org.opendaylight.protocol.bgp.parser.impl;
10 import static org.junit.Assert.assertArrayEquals;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertNotSame;
14 import static org.junit.Assert.fail;
16 import io.netty.buffer.ByteBuf;
17 import io.netty.buffer.Unpooled;
18 import java.util.ArrayList;
19 import java.util.List;
20 import org.junit.Test;
21 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
22 import org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser;
23 import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
24 import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext;
25 import org.opendaylight.protocol.util.ByteArray;
26 import org.opendaylight.protocol.util.NoopReferenceCache;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.optional.capabilities.CParameters;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.As4BytesCase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.As4BytesCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.as4.bytes._case.As4BytesCapabilityBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.AggregatorBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.ExtendedCommunities;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.MultiprotocolCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart._case.GracefulRestartCapability;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart._case.GracefulRestartCapability.RestartFlags;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart._case.GracefulRestartCapabilityBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart._case.graceful.restart.capability.Tables;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart._case.graceful.restart.capability.TablesBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.multiprotocol._case.MultiprotocolCapability;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.multiprotocol._case.MultiprotocolCapabilityBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpAggregator;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ShortAsNumber;
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.extended.community.extended.community.AsSpecificExtendedCommunityCase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.AsSpecificExtendedCommunityCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.Inet4SpecificExtendedCommunityCase;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.Inet4SpecificExtendedCommunityCaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.OpaqueExtendedCommunityCase;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.OpaqueExtendedCommunityCaseBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteOriginExtendedCommunityCase;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteOriginExtendedCommunityCaseBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteTargetExtendedCommunityCase;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteTargetExtendedCommunityCaseBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.as.specific.extended.community._case.AsSpecificExtendedCommunityBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.inet4.specific.extended.community._case.Inet4SpecificExtendedCommunityBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.opaque.extended.community._case.OpaqueExtendedCommunityBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.route.origin.extended.community._case.RouteOriginExtendedCommunityBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.route.target.extended.community._case.RouteTargetExtendedCommunityBuilder;
65 public class ComplementaryTest {
68 public void testBGPParameter() {
70 final MultiprotocolCapability cap = new MultiprotocolCapabilityBuilder().setAfi(Ipv6AddressFamily.class).setSafi(
71 UnicastSubsequentAddressFamily.class).build();
72 final CParameters tlv1 = new MultiprotocolCaseBuilder().setMultiprotocolCapability(cap).build();
74 final MultiprotocolCapability cap1 = new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(
75 UnicastSubsequentAddressFamily.class).build();
76 final CParameters tlv2 = new MultiprotocolCaseBuilder().setMultiprotocolCapability(cap1).build();
78 final List<Tables> tt = new ArrayList<>();
79 tt.add(new TablesBuilder().setAfi(Ipv6AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build());
80 tt.add(new TablesBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build());
82 final GracefulRestartCapability tlv3 = new GracefulRestartCapabilityBuilder().setRestartFlags(new RestartFlags(Boolean.FALSE)).setRestartTime(0).setTables(tt).build();
84 final CParameters tlv4 = new As4BytesCaseBuilder().setAs4BytesCapability(
85 new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build();
87 assertFalse(tlv3.getRestartFlags().isRestartState());
89 assertEquals(0, tlv3.getRestartTime().intValue());
91 assertFalse(tlv1.equals(tlv2));
93 assertNotSame(tlv1.hashCode(), tlv3.hashCode());
95 assertNotSame(tlv2.toString(), tlv3.toString());
97 assertEquals(tlv3.getTables(), tt);
99 assertEquals(cap.getSafi(), cap1.getSafi());
101 assertNotSame(cap.getAfi(), cap1.getAfi());
103 assertEquals(40, ((As4BytesCase) tlv4).getAs4BytesCapability().getAsNumber().getValue().longValue());
105 assertEquals(new As4BytesCaseBuilder().setAs4BytesCapability(
106 new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build(), tlv4);
110 public void testBGPAggregatorImpl() {
111 final BgpAggregator ipv4 = new AggregatorBuilder().setAsNumber(new AsNumber((long) 5524)).setNetworkAddress(
112 new Ipv4Address("124.55.42.1")).build();
113 final BgpAggregator ipv4i = new AggregatorBuilder().setAsNumber(new AsNumber((long) 5525)).setNetworkAddress(
114 new Ipv4Address("124.55.42.1")).build();
116 assertNotSame(ipv4.hashCode(), ipv4i.hashCode());
118 assertNotSame(ipv4.getAsNumber(), ipv4i.getAsNumber());
120 assertEquals(ipv4.getNetworkAddress(), ipv4i.getNetworkAddress());
123 private static final byte[] communitiesBytes = { 0, 5, 0, 54, 0, 0, 1, 76,
124 40, 5, 0, 54, 0, 0, 1, 76,
125 1, 2, 0, 35, 4, 2, 8, 7,
126 0, 3, 0, 24, 4, 2, 8, 7,
127 41, 6, 12, 51, 2, 5, 21, 45,
128 3, 6, 21, 45, 5, 4, 3, 1,
129 43, 6, 21, 45, 5, 4, 3, 1 };
132 public void testExtendedCommunitiesParser() {
133 final ExtendedCommunitiesAttributeParser parser = new ExtendedCommunitiesAttributeParser(NoopReferenceCache.getInstance());
134 final AttributesBuilder pa = new AttributesBuilder();
136 parser.parseAttribute(Unpooled.copiedBuffer(communitiesBytes), pa);
137 } catch (final BGPDocumentedException e1) {
138 fail("Not expected exception: " + e1);
140 AsSpecificExtendedCommunityCase expected = new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity(
141 new AsSpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator(new ShortAsNumber(54L)).setLocalAdministrator(
142 new byte[] { 0, 0, 1, 76 }).build()).build();
143 ExtendedCommunities ex = pa.getExtendedCommunities().get(0);
144 AsSpecificExtendedCommunityCase result = (AsSpecificExtendedCommunityCase) ex.getExtendedCommunity();
145 assertEquals(expected.getAsSpecificExtendedCommunity().isTransitive(), result.getAsSpecificExtendedCommunity().isTransitive());
146 assertEquals(expected.getAsSpecificExtendedCommunity().getGlobalAdministrator(),
147 result.getAsSpecificExtendedCommunity().getGlobalAdministrator());
148 assertArrayEquals(expected.getAsSpecificExtendedCommunity().getLocalAdministrator(),
149 result.getAsSpecificExtendedCommunity().getLocalAdministrator());
150 assertEquals(0, ex.getCommType().intValue());
152 expected = new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity(
153 new AsSpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator(new ShortAsNumber(54L)).setLocalAdministrator(
154 new byte[] { 0, 0, 1, 76 }).build()).build();
155 ex = pa.getExtendedCommunities().get(1);
156 result = (AsSpecificExtendedCommunityCase) ex.getExtendedCommunity();
157 assertEquals(expected.getAsSpecificExtendedCommunity().isTransitive(), result.getAsSpecificExtendedCommunity().isTransitive());
158 assertEquals(40, ex.getCommType().intValue());
160 final RouteTargetExtendedCommunityCase rexpected = new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity(
161 new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator(new ShortAsNumber(35L)).setLocalAdministrator(
162 new byte[] { 4, 2, 8, 7 }).build()).build();
163 ex = pa.getExtendedCommunities().get(2);
164 final RouteTargetExtendedCommunityCase rresult = (RouteTargetExtendedCommunityCase) ex.getExtendedCommunity();
165 assertEquals(rexpected.getRouteTargetExtendedCommunity().getGlobalAdministrator(),
166 rresult.getRouteTargetExtendedCommunity().getGlobalAdministrator());
167 assertArrayEquals(rexpected.getRouteTargetExtendedCommunity().getLocalAdministrator(),
168 rresult.getRouteTargetExtendedCommunity().getLocalAdministrator());
169 assertEquals(1, ex.getCommType().intValue());
170 assertEquals(2, ex.getCommSubType().intValue());
172 final RouteOriginExtendedCommunityCase oexpected = new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity(
173 new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator(new ShortAsNumber(24L)).setLocalAdministrator(
174 new byte[] { 4, 2, 8, 7 }).build()).build();
175 ex = pa.getExtendedCommunities().get(3);
176 final RouteOriginExtendedCommunityCase oresult = (RouteOriginExtendedCommunityCase) ex.getExtendedCommunity();
177 assertEquals(oexpected.getRouteOriginExtendedCommunity().getGlobalAdministrator(),
178 oresult.getRouteOriginExtendedCommunity().getGlobalAdministrator());
179 assertArrayEquals(oexpected.getRouteOriginExtendedCommunity().getLocalAdministrator(),
180 oresult.getRouteOriginExtendedCommunity().getLocalAdministrator());
181 assertEquals(0, ex.getCommType().intValue());
182 assertEquals(3, ex.getCommSubType().intValue());
184 final Inet4SpecificExtendedCommunityCase iexpected = new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity(
185 new Inet4SpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator(new Ipv4Address("12.51.2.5")).setLocalAdministrator(
186 new byte[] { 21, 45 }).build()).build();
187 ex = pa.getExtendedCommunities().get(4);
188 final Inet4SpecificExtendedCommunityCase iresult = (Inet4SpecificExtendedCommunityCase) ex.getExtendedCommunity();
189 assertEquals(iexpected.getInet4SpecificExtendedCommunity().isTransitive(),
190 iresult.getInet4SpecificExtendedCommunity().isTransitive());
191 assertEquals(iexpected.getInet4SpecificExtendedCommunity().getGlobalAdministrator(),
192 iresult.getInet4SpecificExtendedCommunity().getGlobalAdministrator());
193 assertArrayEquals(iexpected.getInet4SpecificExtendedCommunity().getLocalAdministrator(),
194 iresult.getInet4SpecificExtendedCommunity().getLocalAdministrator());
195 assertEquals(41, ex.getCommType().intValue());
197 final OpaqueExtendedCommunityCase oeexpected = new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity(
198 new OpaqueExtendedCommunityBuilder().setTransitive(false).setValue(new byte[] { 21, 45, 5, 4, 3, 1 }).build()).build();
199 ex = pa.getExtendedCommunities().get(5);
200 final OpaqueExtendedCommunityCase oeresult = (OpaqueExtendedCommunityCase) ex.getExtendedCommunity();
201 assertEquals(oeexpected.getOpaqueExtendedCommunity().isTransitive(), oeresult.getOpaqueExtendedCommunity().isTransitive());
202 assertArrayEquals(oeexpected.getOpaqueExtendedCommunity().getValue(), oeresult.getOpaqueExtendedCommunity().getValue());
203 assertEquals(3, ex.getCommType().intValue());
205 final OpaqueExtendedCommunityCase oeexpected1 = new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity(
206 new OpaqueExtendedCommunityBuilder().setTransitive(true).setValue(new byte[] { 21, 45, 5, 4, 3, 1 }).build()).build();
207 ex = pa.getExtendedCommunities().get(6);
208 final OpaqueExtendedCommunityCase oeresult1 = (OpaqueExtendedCommunityCase) ex.getExtendedCommunity();
209 assertEquals(oeexpected1.getOpaqueExtendedCommunity().isTransitive(), oeresult1.getOpaqueExtendedCommunity().isTransitive());
210 assertArrayEquals(oeexpected1.getOpaqueExtendedCommunity().getValue(), oeresult1.getOpaqueExtendedCommunity().getValue());
211 assertEquals(43, ex.getCommType().intValue());
213 final ByteBuf serializedBuffer = Unpooled.buffer();
214 parser.serializeAttribute(pa.build(), serializedBuffer);
215 assertArrayEquals(new byte[]{ (byte)192, 16, 56, 0, 5, 0, 54, 0, 0, 1, 76,
216 40, 5, 0, 54, 0, 0, 1, 76,
217 1, 2, 0, 35, 4, 2, 8, 7,
218 0, 3, 0, 24, 4, 2, 8, 7,
219 41, 6, 12, 51, 2, 5, 21, 45,
220 3, 6, 21, 45, 5, 4, 3, 1,
221 43, 6, 21, 45, 5, 4, 3, 1 }, ByteArray.readAllBytes(serializedBuffer));
224 parser.parseAttribute(Unpooled.copiedBuffer(new byte[] { 11, 11, 21, 45, 5, 4, 3, 1 }), pa);
225 fail("Exception should have occured.");
226 } catch (final BGPDocumentedException e) {
227 assertEquals("Could not parse Extended Community type: 11", e.getMessage());
232 public void testBGPHeaderParser() throws Exception {
233 final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry();
235 msgReg.parseMessage(Unpooled.copiedBuffer(new byte[] { (byte) 0, (byte) 0 }));
236 fail("Exception should have occured.");
237 } catch (final IllegalArgumentException e) {
238 assertEquals("Too few bytes in passed array. Passed: 2. Expected: >= 19.", e.getMessage());
243 public void testMessageParser() throws Exception {
244 final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry();
247 msgReg.serializeMessage(null, Unpooled.EMPTY_BUFFER);
248 } catch (final NullPointerException e) {
251 assertEquals("BGPMessage is mandatory.", ex);