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