Bug 3117 - Capability Parameter Parse Issue
[bgpcep.git] / bgp / parser-mock / src / test / java / org / opendaylight / protocol / bgp / parser / mock / BGPMessageParserMockTest.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.mock;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotSame;
12
13 import com.google.common.collect.Lists;
14 import com.google.common.collect.Maps;
15 import com.google.common.collect.Sets;
16 import io.netty.buffer.ByteBuf;
17 import io.netty.buffer.Unpooled;
18 import java.io.ByteArrayOutputStream;
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.net.UnknownHostException;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.Set;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
28 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
29 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv6.prefixes.DestinationIpv6Builder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv6.prefixes.destination.ipv6.Ipv6PrefixesBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationIpv6CaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Open;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.OpenBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.ProtocolVersion;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Update;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.UpdateBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParametersBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.OptionalCapabilities;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.OptionalCapabilitiesBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.optional.capabilities.CParameters;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.optional.capabilities.CParametersBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.AsPathBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.OriginBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.as.path.Segments;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.as.path.SegmentsBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes1;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes1Builder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.MultiprotocolCapabilityBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpOrigin;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.MplsLabeledVpnSubsequentAddressFamily;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.AListCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.a.list._case.AListBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.a.list._case.a.list.AsSequence;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.a.list._case.a.list.AsSequenceBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
72 import org.opendaylight.yangtools.yang.binding.Notification;
73
74 public class BGPMessageParserMockTest {
75
76     private final byte[][] inputBytes = new byte[11][];
77     private final List<Update> messages = Lists.newArrayList();
78
79     @Before
80     public void init() throws Exception {
81         // Creating input bytes and update messages
82         for (int i = 0; i < this.inputBytes.length; i++) {
83             this.inputBytes[i] = this.fillInputBytes(i);
84             this.messages.add(this.fillMessages(i));
85         }
86     }
87
88     /**
89      * Test if mock implementation of parser returns correct message
90      *
91      * @throws BGPParsingException
92      * @throws BGPDocumentedException
93      * @throws IOException
94      */
95     @Test
96     public void testGetUpdateMessage() throws BGPParsingException, BGPDocumentedException, IOException {
97         final Map<ByteBuf, Notification> updateMap = Maps.newHashMap();
98         for (int i = 0; i < this.inputBytes.length; i++) {
99             updateMap.put(Unpooled.copiedBuffer(this.inputBytes[i]), this.messages.get(i));
100         }
101         final BGPMessageParserMock mockParser = new BGPMessageParserMock(updateMap);
102
103         for (int i = 0; i < this.inputBytes.length; i++) {
104             assertEquals(this.messages.get(i), mockParser.parseMessage(Unpooled.copiedBuffer(this.inputBytes[i])));
105         }
106         assertNotSame(this.messages.get(3), mockParser.parseMessage(Unpooled.copiedBuffer(this.inputBytes[8])));
107     }
108
109     /**
110      * Test if method throws IllegalArgumentException after finding no BGPUpdateMessage associated with given byte[] key
111      *
112      * @throws BGPDocumentedException
113      * @throws BGPParsingException
114      * @throws IOException
115      */
116     @Test(expected = IllegalArgumentException.class)
117     public void testGetUpdateMessageException() throws BGPParsingException, BGPDocumentedException, IOException {
118         final Map<ByteBuf, Notification> updateMap = Maps.newHashMap();
119         for (int i = 0; i < this.inputBytes.length; i++) {
120             updateMap.put(Unpooled.copiedBuffer(this.inputBytes[i]), this.messages.get(i));
121         }
122         final BGPMessageParserMock mockParser = new BGPMessageParserMock(updateMap);
123         mockParser.parseMessage(Unpooled.copiedBuffer(new byte[] { 7, 4, 6 }));
124     }
125
126     /**
127      * Helper method to fill inputBytes variable
128      *
129      * @param fileNumber parameter to distinguish between files from which bytes are read
130      */
131     private byte[] fillInputBytes(final int fileNumber) throws Exception {
132         final ByteArrayOutputStream bis = new ByteArrayOutputStream();
133         final byte[] data = new byte[60];
134         int nRead = 0;
135         try (final InputStream is = this.getClass().getResourceAsStream("/up" + fileNumber + ".bin")) {
136             while ((nRead = is.read(data, 0, data.length)) != -1) {
137                 bis.write(data, 0, nRead);
138             }
139             bis.flush();
140             is.close();
141         }
142         return bis.toByteArray();
143     }
144
145     /**
146      * Helper method to fill messages variable
147      *
148      * @param asn this parameter is passed to ASNumber constructor
149      */
150     private Update fillMessages(final long asn) throws UnknownHostException {
151
152         final UpdateBuilder builder = new UpdateBuilder();
153
154         final List<AsSequence> asnums = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(asn)).build());
155         final List<Segments> asPath = Lists.newArrayList();
156         asPath.add(new SegmentsBuilder().setCSegment(
157             new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(asnums).build()).build()).build());
158         final CNextHop nextHop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(
159             new Ipv6NextHopBuilder().setGlobal(new Ipv6Address("2001:db8::1")).setLinkLocal(new Ipv6Address("fe80::c001:bff:fe7e:0")).build()).build();
160
161         final Ipv6Prefix pref1 = new Ipv6Prefix("2001:db8:1:2::/64");
162         final Ipv6Prefix pref2 = new Ipv6Prefix("2001:db8:1:1::/64");
163         final Ipv6Prefix pref3 = new Ipv6Prefix("2001:db8:1::/64");
164
165         final AttributesBuilder paBuilder = new AttributesBuilder();
166         paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build());
167         paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build());
168
169         final MpReachNlriBuilder mpReachBuilder = new MpReachNlriBuilder();
170         mpReachBuilder.setAfi(Ipv6AddressFamily.class);
171         mpReachBuilder.setSafi(UnicastSubsequentAddressFamily.class);
172         mpReachBuilder.setCNextHop(nextHop);
173         mpReachBuilder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
174             new DestinationIpv6CaseBuilder().setDestinationIpv6(
175                 new DestinationIpv6Builder().setIpv6Prefixes(Lists.newArrayList(
176                     new Ipv6PrefixesBuilder().setPrefix(pref1).build(),new Ipv6PrefixesBuilder().setPrefix(pref2).build(),
177                     new Ipv6PrefixesBuilder().setPrefix(pref3).build())).build()).build()).build());
178
179         paBuilder.addAugmentation(Attributes1.class, new Attributes1Builder().setMpReachNlri(mpReachBuilder.build()).build());
180
181         builder.setAttributes(paBuilder.build());
182
183         return builder.build();
184     }
185
186     @Test
187     public void testGetOpenMessage() throws BGPParsingException, BGPDocumentedException, IOException {
188         final Map<ByteBuf, Notification> openMap = Maps.newHashMap();
189
190         final Set<BgpTableType> type = Sets.newHashSet();
191         type.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class));
192
193         final List<BgpParameters> params = Lists.newArrayList();
194
195         final CParameters par = new CParametersBuilder().addAugmentation(CParameters1.class, new CParameters1Builder()
196             .setMultiprotocolCapability(new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class)
197                 .setSafi(MplsLabeledVpnSubsequentAddressFamily.class).build()).build()).build();
198         params.add(new BgpParametersBuilder().setOptionalCapabilities(Lists.newArrayList(
199             new OptionalCapabilitiesBuilder().setCParameters(par).build())).build());
200
201         final byte[] input = new byte[] { 5, 8, 13, 21 };
202
203         openMap.put(Unpooled.copiedBuffer(input), new OpenBuilder().setMyAsNumber(30).setHoldTimer(30).setBgpParameters(params).setVersion(
204             new ProtocolVersion((short) 4)).build());
205
206         final BGPMessageParserMock mockParser = new BGPMessageParserMock(openMap);
207
208         final Set<BgpTableType> result = Sets.newHashSet();
209         for (final BgpParameters p : ((Open) mockParser.parseMessage(Unpooled.copiedBuffer(input))).getBgpParameters()) {
210             for (final OptionalCapabilities capa : p.getOptionalCapabilities()) {
211                 final CParameters cp = capa.getCParameters();
212                 if (cp.getAugmentation(CParameters1.class) != null && cp.getAugmentation(CParameters1.class).getMultiprotocolCapability() != null) {
213                     final BgpTableType t = new BgpTableTypeImpl(cp.getAugmentation(CParameters1.class).getMultiprotocolCapability().getAfi(),
214                             cp.getAugmentation(CParameters1.class).getMultiprotocolCapability().getSafi());
215                     result.add(t);
216                 }
217             }
218         }
219         assertEquals(type, result);
220     }
221 }