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.lang.reflect.Constructor;
19 import java.lang.reflect.InvocationTargetException;
20 import java.util.ArrayList;
21 import java.util.List;
22 import org.junit.Test;
23 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
24 import org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathSegmentParser;
25 import org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser;
26 import org.opendaylight.protocol.util.ByteArray;
27 import org.opendaylight.protocol.util.NoopReferenceCache;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParameters;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.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.CParameters1;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.GracefulRestartCapability;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.GracefulRestartCapability.RestartFlags;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.GracefulRestartCapabilityBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.MultiprotocolCapability;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.MultiprotocolCapabilityBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart.capability.Tables;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart.capability.TablesBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpAggregator;
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.ShortAsNumber;
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.extended.community.extended.community.AsSpecificExtendedCommunityCase;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.AsSpecificExtendedCommunityCaseBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.Inet4SpecificExtendedCommunityCase;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.Inet4SpecificExtendedCommunityCaseBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.OpaqueExtendedCommunityCase;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.OpaqueExtendedCommunityCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteOriginExtendedCommunityCase;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteOriginExtendedCommunityCaseBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteTargetExtendedCommunityCase;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteTargetExtendedCommunityCaseBuilder;
60 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;
61 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;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.opaque.extended.community._case.OpaqueExtendedCommunityBuilder;
63 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;
64 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;
66 public class ComplementaryTest {
69 public void testBGPParameter() {
71 final MultiprotocolCapability cap = new MultiprotocolCapabilityBuilder().setAfi(Ipv6AddressFamily.class).setSafi(
72 UnicastSubsequentAddressFamily.class).build();
73 final CParameters tlv1 = new CParametersBuilder().addAugmentation(CParameters1.class, new CParameters1Builder()
74 .setMultiprotocolCapability(cap).build()).build();
75 final MultiprotocolCapability cap1 = new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(
76 UnicastSubsequentAddressFamily.class).build();
77 final CParameters tlv2 = new CParametersBuilder().addAugmentation(CParameters1.class, new CParameters1Builder()
78 .setMultiprotocolCapability(cap1).build()).build();
80 final List<Tables> tt = new ArrayList<>();
81 tt.add(new TablesBuilder().setAfi(Ipv6AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build());
82 tt.add(new TablesBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build());
84 final GracefulRestartCapability tlv3 = new GracefulRestartCapabilityBuilder().setRestartFlags(new RestartFlags(Boolean.FALSE)).setRestartTime(0).setTables(tt).build();
86 final CParameters tlv4 = new CParametersBuilder().setAs4BytesCapability(
87 new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build();
89 assertFalse(tlv3.getRestartFlags().isRestartState());
91 assertEquals(0, tlv3.getRestartTime().intValue());
93 assertFalse(tlv1.equals(tlv2));
95 assertNotSame(tlv1.hashCode(), tlv3.hashCode());
97 assertNotSame(tlv2.toString(), tlv3.toString());
99 assertEquals(tlv3.getTables(), tt);
101 assertEquals(cap.getSafi(), cap1.getSafi());
103 assertNotSame(cap.getAfi(), cap1.getAfi());
105 assertEquals(40, tlv4.getAs4BytesCapability().getAsNumber().getValue().longValue());
107 assertEquals(new CParametersBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build(), tlv4);
111 public void testBGPAggregatorImpl() {
112 final BgpAggregator ipv4 = new AggregatorBuilder().setAsNumber(new AsNumber((long) 5524)).setNetworkAddress(
113 new Ipv4Address("124.55.42.1")).build();
114 final BgpAggregator ipv4i = new AggregatorBuilder().setAsNumber(new AsNumber((long) 5525)).setNetworkAddress(
115 new Ipv4Address("124.55.42.1")).build();
117 assertNotSame(ipv4.hashCode(), ipv4i.hashCode());
119 assertNotSame(ipv4.getAsNumber(), ipv4i.getAsNumber());
121 assertEquals(ipv4.getNetworkAddress(), ipv4i.getNetworkAddress());
124 private static final byte[] communitiesBytes = { 0, 5, 0, 54, 0, 0, 1, 76,
125 40, 5, 0, 54, 0, 0, 1, 76,
126 1, 2, 0, 35, 4, 2, 8, 7,
127 0, 3, 0, 24, 4, 2, 8, 7,
128 41, 6, 12, 51, 2, 5, 21, 45,
129 3, 6, 21, 45, 5, 4, 3, 1,
130 43, 6, 21, 45, 5, 4, 3, 1 };
133 public void testExtendedCommunitiesParser() {
134 final ExtendedCommunitiesAttributeParser parser = new ExtendedCommunitiesAttributeParser(NoopReferenceCache.getInstance());
135 final AttributesBuilder pa = new AttributesBuilder();
137 parser.parseAttribute(Unpooled.copiedBuffer(communitiesBytes), pa);
138 } catch (final BGPDocumentedException e1) {
139 fail("Not expected exception: " + e1);
141 AsSpecificExtendedCommunityCase expected = new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity(
142 new AsSpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator(new ShortAsNumber(54L)).setLocalAdministrator(
143 new byte[] { 0, 0, 1, 76 }).build()).build();
144 ExtendedCommunities ex = pa.getExtendedCommunities().get(0);
145 AsSpecificExtendedCommunityCase result = (AsSpecificExtendedCommunityCase) ex.getExtendedCommunity();
146 assertEquals(expected.getAsSpecificExtendedCommunity().isTransitive(), result.getAsSpecificExtendedCommunity().isTransitive());
147 assertEquals(expected.getAsSpecificExtendedCommunity().getGlobalAdministrator(),
148 result.getAsSpecificExtendedCommunity().getGlobalAdministrator());
149 assertArrayEquals(expected.getAsSpecificExtendedCommunity().getLocalAdministrator(),
150 result.getAsSpecificExtendedCommunity().getLocalAdministrator());
151 assertEquals(0, ex.getCommType().intValue());
153 expected = new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity(
154 new AsSpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator(new ShortAsNumber(54L)).setLocalAdministrator(
155 new byte[] { 0, 0, 1, 76 }).build()).build();
156 ex = pa.getExtendedCommunities().get(1);
157 result = (AsSpecificExtendedCommunityCase) ex.getExtendedCommunity();
158 assertEquals(expected.getAsSpecificExtendedCommunity().isTransitive(), result.getAsSpecificExtendedCommunity().isTransitive());
159 assertEquals(40, ex.getCommType().intValue());
161 final RouteTargetExtendedCommunityCase rexpected = new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity(
162 new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator(new ShortAsNumber(35L)).setLocalAdministrator(
163 new byte[] { 4, 2, 8, 7 }).build()).build();
164 ex = pa.getExtendedCommunities().get(2);
165 final RouteTargetExtendedCommunityCase rresult = (RouteTargetExtendedCommunityCase) ex.getExtendedCommunity();
166 assertEquals(rexpected.getRouteTargetExtendedCommunity().getGlobalAdministrator(),
167 rresult.getRouteTargetExtendedCommunity().getGlobalAdministrator());
168 assertArrayEquals(rexpected.getRouteTargetExtendedCommunity().getLocalAdministrator(),
169 rresult.getRouteTargetExtendedCommunity().getLocalAdministrator());
170 assertEquals(1, ex.getCommType().intValue());
171 assertEquals(2, ex.getCommSubType().intValue());
173 final RouteOriginExtendedCommunityCase oexpected = new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity(
174 new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator(new ShortAsNumber(24L)).setLocalAdministrator(
175 new byte[] { 4, 2, 8, 7 }).build()).build();
176 ex = pa.getExtendedCommunities().get(3);
177 final RouteOriginExtendedCommunityCase oresult = (RouteOriginExtendedCommunityCase) ex.getExtendedCommunity();
178 assertEquals(oexpected.getRouteOriginExtendedCommunity().getGlobalAdministrator(),
179 oresult.getRouteOriginExtendedCommunity().getGlobalAdministrator());
180 assertArrayEquals(oexpected.getRouteOriginExtendedCommunity().getLocalAdministrator(),
181 oresult.getRouteOriginExtendedCommunity().getLocalAdministrator());
182 assertEquals(0, ex.getCommType().intValue());
183 assertEquals(3, ex.getCommSubType().intValue());
185 final Inet4SpecificExtendedCommunityCase iexpected = new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity(
186 new Inet4SpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator(new Ipv4Address("12.51.2.5")).setLocalAdministrator(
187 new byte[] { 21, 45 }).build()).build();
188 ex = pa.getExtendedCommunities().get(4);
189 final Inet4SpecificExtendedCommunityCase iresult = (Inet4SpecificExtendedCommunityCase) ex.getExtendedCommunity();
190 assertEquals(iexpected.getInet4SpecificExtendedCommunity().isTransitive(),
191 iresult.getInet4SpecificExtendedCommunity().isTransitive());
192 assertEquals(iexpected.getInet4SpecificExtendedCommunity().getGlobalAdministrator(),
193 iresult.getInet4SpecificExtendedCommunity().getGlobalAdministrator());
194 assertArrayEquals(iexpected.getInet4SpecificExtendedCommunity().getLocalAdministrator(),
195 iresult.getInet4SpecificExtendedCommunity().getLocalAdministrator());
196 assertEquals(41, ex.getCommType().intValue());
198 final OpaqueExtendedCommunityCase oeexpected = new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity(
199 new OpaqueExtendedCommunityBuilder().setTransitive(false).setValue(new byte[] { 21, 45, 5, 4, 3, 1 }).build()).build();
200 ex = pa.getExtendedCommunities().get(5);
201 final OpaqueExtendedCommunityCase oeresult = (OpaqueExtendedCommunityCase) ex.getExtendedCommunity();
202 assertEquals(oeexpected.getOpaqueExtendedCommunity().isTransitive(), oeresult.getOpaqueExtendedCommunity().isTransitive());
203 assertArrayEquals(oeexpected.getOpaqueExtendedCommunity().getValue(), oeresult.getOpaqueExtendedCommunity().getValue());
204 assertEquals(3, ex.getCommType().intValue());
206 final OpaqueExtendedCommunityCase oeexpected1 = new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity(
207 new OpaqueExtendedCommunityBuilder().setTransitive(true).setValue(new byte[] { 21, 45, 5, 4, 3, 1 }).build()).build();
208 ex = pa.getExtendedCommunities().get(6);
209 final OpaqueExtendedCommunityCase oeresult1 = (OpaqueExtendedCommunityCase) ex.getExtendedCommunity();
210 assertEquals(oeexpected1.getOpaqueExtendedCommunity().isTransitive(), oeresult1.getOpaqueExtendedCommunity().isTransitive());
211 assertArrayEquals(oeexpected1.getOpaqueExtendedCommunity().getValue(), oeresult1.getOpaqueExtendedCommunity().getValue());
212 assertEquals(43, ex.getCommType().intValue());
214 final ByteBuf serializedBuffer = Unpooled.buffer();
215 parser.serializeAttribute(pa.build(), serializedBuffer);
216 assertArrayEquals(new byte[]{ (byte)192, 16, 56, 0, 5, 0, 54, 0, 0, 1, 76,
217 40, 5, 0, 54, 0, 0, 1, 76,
218 1, 2, 0, 35, 4, 2, 8, 7,
219 0, 3, 0, 24, 4, 2, 8, 7,
220 41, 6, 12, 51, 2, 5, 21, 45,
221 3, 6, 21, 45, 5, 4, 3, 1,
222 43, 6, 21, 45, 5, 4, 3, 1 }, ByteArray.readAllBytes(serializedBuffer));
225 parser.parseAttribute(Unpooled.copiedBuffer(new byte[] { 11, 11, 21, 45, 5, 4, 3, 1 }), pa);
226 fail("Exception should have occured.");
227 } catch (final BGPDocumentedException e) {
228 assertEquals("Could not parse Extended Community type: 11", e.getMessage());
233 @Test(expected=UnsupportedOperationException.class)
234 public void testAsPathSegmentParserPrivateConstructor() throws Throwable {
235 final Constructor<AsPathSegmentParser> c = AsPathSegmentParser.class.getDeclaredConstructor();
236 c.setAccessible(true);
239 } catch (final InvocationTargetException e) {