Added a bit more tests for correctness and code coverage.
[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.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;
65
66 public class ComplementaryTest {
67
68     @Test
69     public void testBGPParameter() {
70
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();
79
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());
83
84         final GracefulRestartCapability tlv3 = new GracefulRestartCapabilityBuilder().setRestartFlags(new RestartFlags(Boolean.FALSE)).setRestartTime(0).setTables(tt).build();
85
86         final CParameters tlv4 = new CParametersBuilder().setAs4BytesCapability(
87             new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build();
88
89         assertFalse(tlv3.getRestartFlags().isRestartState());
90
91         assertEquals(0, tlv3.getRestartTime().intValue());
92
93         assertFalse(tlv1.equals(tlv2));
94
95         assertNotSame(tlv1.hashCode(), tlv3.hashCode());
96
97         assertNotSame(tlv2.toString(), tlv3.toString());
98
99         assertEquals(tlv3.getTables(), tt);
100
101         assertEquals(cap.getSafi(), cap1.getSafi());
102
103         assertNotSame(cap.getAfi(), cap1.getAfi());
104
105         assertEquals(40, tlv4.getAs4BytesCapability().getAsNumber().getValue().longValue());
106
107         assertEquals(new CParametersBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build(), tlv4);
108     }
109
110     @Test
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();
116
117         assertNotSame(ipv4.hashCode(), ipv4i.hashCode());
118
119         assertNotSame(ipv4.getAsNumber(), ipv4i.getAsNumber());
120
121         assertEquals(ipv4.getNetworkAddress(), ipv4i.getNetworkAddress());
122     }
123
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 };
131
132     @Test
133     public void testExtendedCommunitiesParser() {
134         final ExtendedCommunitiesAttributeParser parser = new ExtendedCommunitiesAttributeParser(NoopReferenceCache.getInstance());
135         final AttributesBuilder pa = new AttributesBuilder();
136         try {
137             parser.parseAttribute(Unpooled.copiedBuffer(communitiesBytes), pa);
138         } catch (final BGPDocumentedException e1) {
139             fail("Not expected exception: " + e1);
140         }
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());
152
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());
160
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());
172
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());
184
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());
197
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());
205
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());
213
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));
223
224         try {
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());
229         }
230     }
231
232
233     @Test(expected=UnsupportedOperationException.class)
234     public void testAsPathSegmentParserPrivateConstructor() throws Throwable {
235         final Constructor<AsPathSegmentParser> c = AsPathSegmentParser.class.getDeclaredConstructor();
236         c.setAccessible(true);
237         try {
238             c.newInstance();
239         } catch (final InvocationTargetException e) {
240             throw e.getCause();
241         }
242     }
243 }