moved BGP Table type from concepts to parser-api.
[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.hamcrest.core.IsNot.not;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertThat;
13
14 import java.io.ByteArrayOutputStream;
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.net.InetAddress;
18 import java.net.UnknownHostException;
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.HashSet;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.Set;
25
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.opendaylight.protocol.bgp.concepts.BGPObject;
29 import org.opendaylight.protocol.bgp.concepts.BaseBGPObjectState;
30 import org.opendaylight.protocol.bgp.linkstate.NetworkObjectState;
31 import org.opendaylight.protocol.bgp.linkstate.NetworkRouteState;
32 import org.opendaylight.protocol.bgp.parser.BGPParameter;
33 import org.opendaylight.protocol.bgp.parser.BGPRoute;
34 import org.opendaylight.protocol.bgp.parser.BGPTableType;
35 import org.opendaylight.protocol.bgp.parser.BGPUpdateMessage;
36 import org.opendaylight.protocol.bgp.parser.impl.BGPUpdateMessageImpl;
37 import org.opendaylight.protocol.bgp.parser.message.BGPOpenMessage;
38 import org.opendaylight.protocol.bgp.parser.parameter.MultiprotocolCapability;
39 import org.opendaylight.protocol.bgp.util.BGPIPv6RouteImpl;
40 import org.opendaylight.protocol.concepts.IPv6Address;
41 import org.opendaylight.protocol.concepts.IPv6Prefix;
42 import org.opendaylight.protocol.concepts.Identifier;
43 import org.opendaylight.protocol.concepts.Prefix;
44 import org.opendaylight.protocol.framework.DeserializerException;
45 import org.opendaylight.protocol.framework.DocumentedException;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130918.path.attributes.as.path.SegmentsBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AsPathSegment;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpOrigin;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Community;
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.MplsLabeledVpnSubsequentAddressFamily;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.CAListBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.c.a.list.AsSequence;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.c.a.list.AsSequenceBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.ExtendedCommunity;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.CIpv6NextHopBuilder;
60 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;
61 import org.opendaylight.yangtools.yang.binding.Notification;
62
63 import com.google.common.collect.Lists;
64 import com.google.common.collect.Maps;
65 import com.google.common.collect.Sets;
66
67 public class BGPMessageParserMockTest {
68
69         private final byte[][] inputBytes = new byte[11][];
70         private final List<BGPUpdateMessage> messages = new ArrayList<BGPUpdateMessage>();
71
72         @Before
73         public void init() throws Exception {
74                 // Creating input bytes and update messages
75                 for (int i = 0; i < this.inputBytes.length; i++) {
76                         this.inputBytes[i] = this.fillInputBytes(i);
77                         this.messages.add(this.fillMessages(i));
78                 }
79         }
80
81         /**
82          * Test if mock implementation of parser returns correct message
83          * 
84          * @throws DocumentedException
85          * @throws DeserializerException
86          * @throws IOException
87          */
88         @Test
89         public void testGetUpdateMessage() throws DeserializerException, DocumentedException, IOException {
90                 final Map<byte[], List<Notification>> updateMap = Maps.newHashMap();
91                 for (int i = 0; i < this.inputBytes.length; i++) {
92                         updateMap.put(this.inputBytes[i], Lists.newArrayList((Notification) this.messages.get(i)));
93                 }
94
95                 final BGPMessageParserMock mockParser = new BGPMessageParserMock(updateMap);
96
97                 for (int i = 0; i < this.inputBytes.length; i++) {
98                         assertEquals(this.messages.get(i), mockParser.parse(this.inputBytes[i]).get(0));
99                 }
100                 assertThat(this.messages.get(3), not(mockParser.parse(this.inputBytes[8]).get(0)));
101         }
102
103         /**
104          * Test if method throws IllegalArgumentException after finding no BGPUpdateMessage associated with given byte[] key
105          * 
106          * @throws DocumentedException
107          * @throws DeserializerException
108          * @throws IOException
109          */
110         @Test(expected = IllegalArgumentException.class)
111         public void testGetUpdateMessageException() throws DeserializerException, DocumentedException, IOException {
112                 final Map<byte[], List<Notification>> updateMap = Maps.newHashMap();
113                 for (int i = 0; i < this.inputBytes.length; i++) {
114                         updateMap.put(this.inputBytes[i], Lists.newArrayList((Notification) this.messages.get(i)));
115                 }
116
117                 final BGPMessageParserMock mockParser = new BGPMessageParserMock(updateMap);
118                 mockParser.parse(new byte[] { 7, 4, 6 });
119         }
120
121         /**
122          * Helper method to fill inputBytes variable
123          * 
124          * @param fileNumber parameter to distinguish between files from which bytes are read
125          */
126         private byte[] fillInputBytes(final int fileNumber) throws Exception {
127
128                 final InputStream is = this.getClass().getResourceAsStream("/up" + fileNumber + ".bin");
129                 final ByteArrayOutputStream bis = new ByteArrayOutputStream();
130                 final byte[] data = new byte[60];
131                 int nRead = 0;
132
133                 while ((nRead = is.read(data, 0, data.length)) != -1) {
134                         bis.write(data, 0, nRead);
135                 }
136                 bis.flush();
137                 return bis.toByteArray();
138         }
139
140         /**
141          * Helper method to fill messages variable
142          * 
143          * @param asn this parameter is passed to ASNumber constructor
144          */
145         private BGPUpdateMessage fillMessages(final long asn) throws UnknownHostException {
146
147                 final List<AsSequence> asnums = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(asn)).build());
148                 final List<AsPathSegment> asPath = Lists.newArrayList();
149                 asPath.add(new SegmentsBuilder().setCSegment(new CAListBuilder().setAsSequence(asnums).build()).build());
150                 final CNextHop nextHop = new CIpv6NextHopBuilder().setIpv6NextHop(
151                                 new Ipv6NextHopBuilder().setGlobal(new Ipv6Address("2001:db8::1")).setLinkLocal(new Ipv6Address("fe80::c001:bff:fe7e:0")).build()).build();
152
153                 final Prefix<IPv6Address> pref1 = new IPv6Prefix(new IPv6Address(InetAddress.getByName("2001:db8:1:2::")), 64);
154                 final Prefix<IPv6Address> pref2 = new IPv6Prefix(new IPv6Address(InetAddress.getByName("2001:db8:1:1::")), 64);
155                 final Prefix<IPv6Address> pref3 = new IPv6Prefix(new IPv6Address(InetAddress.getByName("2001:db8:1::")), 64);
156
157                 final Set<BGPObject> addedObjects = new HashSet<BGPObject>();
158
159                 final NetworkRouteState nstate = new NetworkRouteState(new NetworkObjectState(asPath, Collections.<Community> emptySet(), Collections.<ExtendedCommunity> emptySet()), nextHop);
160                 final BaseBGPObjectState state = new BaseBGPObjectState(BgpOrigin.Igp, null);
161
162                 final BGPRoute route1 = new BGPIPv6RouteImpl(pref1, state, nstate);
163                 final BGPRoute route2 = new BGPIPv6RouteImpl(pref2, state, nstate);
164                 final BGPRoute route3 = new BGPIPv6RouteImpl(pref3, state, nstate);
165                 addedObjects.add(route1);
166                 addedObjects.add(route2);
167                 addedObjects.add(route3);
168
169                 return new BGPUpdateMessageImpl(addedObjects, Collections.<Identifier> emptySet());
170         }
171
172         @Test
173         public void testGetOpenMessage() throws DeserializerException, DocumentedException, IOException {
174                 final Map<byte[], List<Notification>> openMap = Maps.newHashMap();
175
176                 final Set<BGPTableType> type = Sets.newHashSet();
177                 type.add(new BGPTableType(Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class));
178
179                 final List<BGPParameter> params = Lists.newArrayList();
180                 params.add(new MultiprotocolCapability(new BGPTableType(Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class)));
181
182                 final byte[] input = new byte[] { 5, 8, 13, 21 };
183
184                 openMap.put(input, Lists.newArrayList((Notification) new BGPOpenMessage(new AsNumber((long) 30), (short) 30, null, params)));
185
186                 final BGPMessageParserMock mockParser = new BGPMessageParserMock(openMap);
187
188                 final Set<BGPTableType> result = Sets.newHashSet();
189                 for (final BGPParameter p : ((BGPOpenMessage) mockParser.parse(input).get(0)).getOptParams()) {
190                         if (p instanceof MultiprotocolCapability) {
191                                 result.add(((MultiprotocolCapability) p).getTableType());
192                         }
193                 }
194
195                 assertEquals(type, result);
196         }
197 }