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