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