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