dbb1d86e0a2b38c13e5881a4fff5d900048a4000
[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 java.util.Map;
17
18 import org.junit.Test;
19 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
20 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
21 import org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesParser;
22 import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
23 import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext;
24 import org.opendaylight.protocol.util.ByteList;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.CParameters;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.As4BytesCase;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.As4BytesCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.as4.bytes._case.As4BytesCapabilityBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AggregatorBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.ExtendedCommunities;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.MultiprotocolCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.multiprotocol._case.MultiprotocolCapability;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.multiprotocol._case.MultiprotocolCapabilityBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpAggregator;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.AsSpecificExtendedCommunityCase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.AsSpecificExtendedCommunityCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.Inet4SpecificExtendedCommunityCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.Inet4SpecificExtendedCommunityCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.OpaqueExtendedCommunityCase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.OpaqueExtendedCommunityCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteOriginExtendedCommunityCase;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteOriginExtendedCommunityCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteTargetExtendedCommunityCase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.RouteTargetExtendedCommunityCaseBuilder;
51 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;
52 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;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.opaque.extended.community._case.OpaqueExtendedCommunityBuilder;
54 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;
55 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;
56
57 import com.google.common.collect.Maps;
58
59 public class ComplementaryTest {
60
61         @Test
62         public void testBGPParameter() {
63
64                 final BgpTableType t = new BgpTableTypeImpl(LinkstateAddressFamily.class, UnicastSubsequentAddressFamily.class);
65                 final BgpTableType t1 = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
66
67                 final MultiprotocolCapability cap = new MultiprotocolCapabilityBuilder().setAfi(LinkstateAddressFamily.class).setSafi(
68                                 UnicastSubsequentAddressFamily.class).build();
69                 final CParameters tlv1 = new MultiprotocolCaseBuilder().setMultiprotocolCapability(cap).build();
70
71                 final MultiprotocolCapability cap1 = new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(
72                                 UnicastSubsequentAddressFamily.class).build();
73                 final CParameters tlv2 = new MultiprotocolCaseBuilder().setMultiprotocolCapability(cap1).build();
74
75                 final Map<BgpTableType, Boolean> tt = Maps.newHashMap();
76                 tt.put(t, true);
77                 tt.put(t1, false);
78
79                 // FIXME: BUG-196: revive test for graceful capability tlv
80                 // final BGPParameter tlv3 = new GracefulCapability(false, 0, tt);
81
82                 final CParameters tlv4 = new As4BytesCaseBuilder().setAs4BytesCapability(
83                                 new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build();
84
85                 // assertFalse(((GracefulCapability) tlv3).isRestartFlag());
86
87                 // assertEquals(0, ((GracefulCapability) tlv3).getRestartTimerValue());
88
89                 assertFalse(tlv1.equals(tlv2));
90
91                 // assertNotSame(tlv1.hashCode(), tlv3.hashCode());
92
93                 // assertNotSame(tlv2.toString(), tlv3.toString());
94
95                 // assertEquals(((GracefulCapability) tlv3).getTableTypes(), tt);
96
97                 assertEquals(cap.getSafi(), cap1.getSafi());
98
99                 assertNotSame(cap.getAfi(), cap1.getAfi());
100
101                 assertEquals(40, ((As4BytesCase) tlv4).getAs4BytesCapability().getAsNumber().getValue().longValue());
102
103                 assertEquals(
104                                 new As4BytesCaseBuilder().setAs4BytesCapability(
105                                                 new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build(), tlv4);
106         }
107
108         @Test
109         public void testBGPAggregatorImpl() {
110                 final BgpAggregator ipv4 = new AggregatorBuilder().setAsNumber(new AsNumber((long) 5524)).setNetworkAddress(
111                                 new Ipv4Address("124.55.42.1")).build();
112                 final BgpAggregator ipv4i = new AggregatorBuilder().setAsNumber(new AsNumber((long) 5525)).setNetworkAddress(
113                                 new Ipv4Address("124.55.42.1")).build();
114
115                 assertNotSame(ipv4.hashCode(), ipv4i.hashCode());
116
117                 assertNotSame(ipv4.getAsNumber(), ipv4i.getAsNumber());
118
119                 assertEquals(ipv4.getNetworkAddress(), ipv4i.getNetworkAddress());
120         }
121
122         @Test
123         public void testCommunitiesParser() {
124                 ExtendedCommunities as = null;
125                 try {
126                         as = CommunitiesParser.parseExtendedCommunity(new byte[] { 0, 5, 0, 54, 0, 0, 1, 76 });
127                 } catch (final BGPDocumentedException e1) {
128                         fail("Not expected exception: " + e1);
129                 }
130                 AsSpecificExtendedCommunityCase expected = new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity(
131                                 new AsSpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator(new AsNumber(54L)).setLocalAdministrator(
132                                                 new byte[] { 0, 0, 1, 76 }).build()).build();
133                 AsSpecificExtendedCommunityCase result = (AsSpecificExtendedCommunityCase) as.getExtendedCommunity();
134                 assertEquals(expected.getAsSpecificExtendedCommunity().isTransitive(), result.getAsSpecificExtendedCommunity().isTransitive());
135                 assertEquals(expected.getAsSpecificExtendedCommunity().getGlobalAdministrator(),
136                                 result.getAsSpecificExtendedCommunity().getGlobalAdministrator());
137                 assertArrayEquals(expected.getAsSpecificExtendedCommunity().getLocalAdministrator(),
138                                 result.getAsSpecificExtendedCommunity().getLocalAdministrator());
139                 assertEquals(0, as.getCommType().intValue());
140
141                 try {
142                         as = CommunitiesParser.parseExtendedCommunity(new byte[] { 40, 5, 0, 54, 0, 0, 1, 76 });
143                 } catch (final BGPDocumentedException e1) {
144                         fail("Not expected exception: " + e1);
145                 }
146                 expected = new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity(
147                                 new AsSpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator(new AsNumber(54L)).setLocalAdministrator(
148                                                 new byte[] { 0, 0, 1, 76 }).build()).build();
149                 result = (AsSpecificExtendedCommunityCase) as.getExtendedCommunity();
150                 assertEquals(expected.getAsSpecificExtendedCommunity().isTransitive(), result.getAsSpecificExtendedCommunity().isTransitive());
151                 assertEquals(40, as.getCommType().intValue());
152
153                 ExtendedCommunities rtc = null;
154                 try {
155                         rtc = CommunitiesParser.parseExtendedCommunity(new byte[] { 1, 2, 0, 35, 4, 2, 8, 7 });
156                 } catch (final BGPDocumentedException e1) {
157                         fail("Not expected exception: " + e1);
158                 }
159                 final RouteTargetExtendedCommunityCase rexpected = new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity(
160                                 new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator(new AsNumber(35L)).setLocalAdministrator(
161                                                 new byte[] { 4, 2, 8, 7 }).build()).build();
162                 final RouteTargetExtendedCommunityCase rresult = (RouteTargetExtendedCommunityCase) rtc.getExtendedCommunity();
163                 assertEquals(rexpected.getRouteTargetExtendedCommunity().getGlobalAdministrator(),
164                                 rresult.getRouteTargetExtendedCommunity().getGlobalAdministrator());
165                 assertArrayEquals(rexpected.getRouteTargetExtendedCommunity().getLocalAdministrator(),
166                                 rresult.getRouteTargetExtendedCommunity().getLocalAdministrator());
167                 assertEquals(1, rtc.getCommType().intValue());
168                 assertEquals(2, rtc.getCommSubType().intValue());
169
170                 ExtendedCommunities roc = null;
171                 try {
172                         roc = CommunitiesParser.parseExtendedCommunity(new byte[] { 0, 3, 0, 24, 4, 2, 8, 7 });
173                 } catch (final BGPDocumentedException e1) {
174                         fail("Not expected exception: " + e1);
175                 }
176                 final RouteOriginExtendedCommunityCase oexpected = new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity(
177                                 new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator(new AsNumber(24L)).setLocalAdministrator(
178                                                 new byte[] { 4, 2, 8, 7 }).build()).build();
179                 final RouteOriginExtendedCommunityCase oresult = (RouteOriginExtendedCommunityCase) roc.getExtendedCommunity();
180                 assertEquals(oexpected.getRouteOriginExtendedCommunity().getGlobalAdministrator(),
181                                 oresult.getRouteOriginExtendedCommunity().getGlobalAdministrator());
182                 assertArrayEquals(oexpected.getRouteOriginExtendedCommunity().getLocalAdministrator(),
183                                 oresult.getRouteOriginExtendedCommunity().getLocalAdministrator());
184                 assertEquals(0, roc.getCommType().intValue());
185                 assertEquals(3, roc.getCommSubType().intValue());
186
187                 ExtendedCommunities sec = null;
188                 try {
189                         sec = CommunitiesParser.parseExtendedCommunity(new byte[] { 41, 6, 12, 51, 2, 5, 21, 45 });
190                 } catch (final BGPDocumentedException e1) {
191                         fail("Not expected exception: " + e1);
192                 }
193                 final Inet4SpecificExtendedCommunityCase iexpected = new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity(
194                                 new Inet4SpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator(new Ipv4Address("12.51.2.5")).setLocalAdministrator(
195                                                 new byte[] { 21, 45 }).build()).build();
196                 final Inet4SpecificExtendedCommunityCase iresult = (Inet4SpecificExtendedCommunityCase) sec.getExtendedCommunity();
197                 assertEquals(iexpected.getInet4SpecificExtendedCommunity().isTransitive(),
198                                 iresult.getInet4SpecificExtendedCommunity().isTransitive());
199                 assertEquals(iexpected.getInet4SpecificExtendedCommunity().getGlobalAdministrator(),
200                                 iresult.getInet4SpecificExtendedCommunity().getGlobalAdministrator());
201                 assertArrayEquals(iexpected.getInet4SpecificExtendedCommunity().getLocalAdministrator(),
202                                 iresult.getInet4SpecificExtendedCommunity().getLocalAdministrator());
203                 assertEquals(41, sec.getCommType().intValue());
204
205                 ExtendedCommunities oec = null;
206                 try {
207                         oec = CommunitiesParser.parseExtendedCommunity(new byte[] { 3, 6, 21, 45, 5, 4, 3, 1 });
208                 } catch (final BGPDocumentedException e1) {
209                         fail("Not expected exception: " + e1);
210                 }
211                 final OpaqueExtendedCommunityCase oeexpected = new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity(
212                                 new OpaqueExtendedCommunityBuilder().setTransitive(false).setValue(new byte[] { 21, 45, 5, 4, 3, 1 }).build()).build();
213                 final OpaqueExtendedCommunityCase oeresult = (OpaqueExtendedCommunityCase) oec.getExtendedCommunity();
214                 assertEquals(oeexpected.getOpaqueExtendedCommunity().isTransitive(), oeresult.getOpaqueExtendedCommunity().isTransitive());
215                 assertArrayEquals(oeexpected.getOpaqueExtendedCommunity().getValue(), oeresult.getOpaqueExtendedCommunity().getValue());
216                 assertEquals(3, oec.getCommType().intValue());
217
218                 try {
219                         oec = CommunitiesParser.parseExtendedCommunity(new byte[] { 43, 6, 21, 45, 5, 4, 3, 1 });
220                 } catch (final BGPDocumentedException e1) {
221                         fail("Not expected exception: " + e1);
222                 }
223                 final OpaqueExtendedCommunityCase oeexpected1 = new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity(
224                                 new OpaqueExtendedCommunityBuilder().setTransitive(true).setValue(new byte[] { 21, 45, 5, 4, 3, 1 }).build()).build();
225                 final OpaqueExtendedCommunityCase oeresult1 = (OpaqueExtendedCommunityCase) oec.getExtendedCommunity();
226                 assertEquals(oeexpected1.getOpaqueExtendedCommunity().isTransitive(), oeresult1.getOpaqueExtendedCommunity().isTransitive());
227                 assertArrayEquals(oeexpected1.getOpaqueExtendedCommunity().getValue(), oeresult1.getOpaqueExtendedCommunity().getValue());
228                 assertEquals(43, oec.getCommType().intValue());
229
230                 try {
231                         CommunitiesParser.parseExtendedCommunity(new byte[] { 11, 11, 21, 45, 5, 4, 3, 1 });
232                         fail("Exception should have occured.");
233                 } catch (final BGPDocumentedException e) {
234                         assertEquals("Could not parse Extended Community type: 11", e.getMessage());
235                 }
236         }
237
238         @Test
239         public void testBGPHeaderParser() throws Exception {
240                 final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.createConsumerContext().getMessageRegistry();
241                 try {
242                         msgReg.parseMessage(new byte[] { (byte) 0, (byte) 0 });
243                         fail("Exception should have occured.");
244                 } catch (final IllegalArgumentException e) {
245                         assertEquals("Too few bytes in passed array. Passed: 2. Expected: >= 19.", e.getMessage());
246                 }
247         }
248
249         @Test
250         public void testByteList() {
251                 final ByteList b1 = new ByteList();
252                 b1.add(new byte[] { 3, 4, 8 });
253                 b1.add(new byte[] { 3, 4, 9 });
254
255                 final ByteList b2 = new ByteList();
256                 b2.add(new byte[] { 3, 4, 8 });
257                 b2.add(new byte[] { 3, 4, 9 });
258
259                 assertEquals(b1, b2);
260                 assertEquals(b1.toString(), b2.toString());
261         }
262
263         @Test
264         public void testMessageParser() throws Exception {
265                 final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.createConsumerContext().getMessageRegistry();
266                 String ex = "";
267                 try {
268                         msgReg.serializeMessage(null);
269                 } catch (final IllegalArgumentException e) {
270                         ex = e.getMessage();
271                 }
272                 assertEquals("BGPMessage is mandatory.", ex);
273         }
274 }