55a50958c165953e50045503f1dc475e9265441e
[bgpcep.git] / bgp / parser-impl / src / test / java / org / opendaylight / protocol / bgp / parser / impl / ComplementaryTest.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.protocol.bgp.parser.impl;
9
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;
15
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;
64
65 public class ComplementaryTest {
66
67     @Test
68     public void testBGPParameter() {
69
70         final MultiprotocolCapability cap = new MultiprotocolCapabilityBuilder().setAfi(Ipv6AddressFamily.class).setSafi(
71                 UnicastSubsequentAddressFamily.class).build();
72         final CParameters tlv1 = new MultiprotocolCaseBuilder().setMultiprotocolCapability(cap).build();
73
74         final MultiprotocolCapability cap1 = new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(
75                 UnicastSubsequentAddressFamily.class).build();
76         final CParameters tlv2 = new MultiprotocolCaseBuilder().setMultiprotocolCapability(cap1).build();
77
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());
81
82         final GracefulRestartCapability tlv3 = new GracefulRestartCapabilityBuilder().setRestartFlags(new RestartFlags(Boolean.FALSE)).setRestartTime(0).setTables(tt).build();
83
84         final CParameters tlv4 = new As4BytesCaseBuilder().setAs4BytesCapability(
85                 new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build();
86
87         assertFalse(tlv3.getRestartFlags().isRestartState());
88
89         assertEquals(0, tlv3.getRestartTime().intValue());
90
91         assertFalse(tlv1.equals(tlv2));
92
93         assertNotSame(tlv1.hashCode(), tlv3.hashCode());
94
95         assertNotSame(tlv2.toString(), tlv3.toString());
96
97         assertEquals(tlv3.getTables(), tt);
98
99         assertEquals(cap.getSafi(), cap1.getSafi());
100
101         assertNotSame(cap.getAfi(), cap1.getAfi());
102
103         assertEquals(40, ((As4BytesCase) tlv4).getAs4BytesCapability().getAsNumber().getValue().longValue());
104
105         assertEquals(new As4BytesCaseBuilder().setAs4BytesCapability(
106                 new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build(), tlv4);
107     }
108
109     @Test
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();
115
116         assertNotSame(ipv4.hashCode(), ipv4i.hashCode());
117
118         assertNotSame(ipv4.getAsNumber(), ipv4i.getAsNumber());
119
120         assertEquals(ipv4.getNetworkAddress(), ipv4i.getNetworkAddress());
121     }
122
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 };
130
131     @Test
132     public void testExtendedCommunitiesParser() {
133         final ExtendedCommunitiesAttributeParser parser = new ExtendedCommunitiesAttributeParser(NoopReferenceCache.getInstance());
134         final AttributesBuilder pa = new AttributesBuilder();
135         try {
136             parser.parseAttribute(Unpooled.copiedBuffer(communitiesBytes), pa);
137         } catch (final BGPDocumentedException e1) {
138             fail("Not expected exception: " + e1);
139         }
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());
151
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());
159
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());
171
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());
183
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());
196
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());
204
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());
212
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));
222
223         try {
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());
228         }
229     }
230
231     @Test
232     public void testBGPHeaderParser() throws Exception {
233         final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry();
234         try {
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());
239         }
240     }
241
242     @Test
243     public void testMessageParser() throws Exception {
244         final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry();
245         String ex = "";
246         try {
247             msgReg.serializeMessage(null, Unpooled.EMPTY_BUFFER);
248         } catch (final NullPointerException e) {
249             ex = e.getMessage();
250         }
251         assertEquals("BGPMessage is mandatory.", ex);
252     }
253 }