2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.protocol.bgp.parser.mock;
10 import static org.hamcrest.core.IsNot.not;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertThat;
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;
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.BGPTableType;
30 import org.opendaylight.protocol.bgp.concepts.BaseBGPObjectState;
31 import org.opendaylight.protocol.bgp.linkstate.NetworkObjectState;
32 import org.opendaylight.protocol.bgp.linkstate.NetworkRouteState;
33 import org.opendaylight.protocol.bgp.parser.BGPParameter;
34 import org.opendaylight.protocol.bgp.parser.BGPRoute;
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;
63 import com.google.common.collect.Lists;
64 import com.google.common.collect.Maps;
65 import com.google.common.collect.Sets;
67 public class BGPMessageParserMockTest {
69 private final byte[][] inputBytes = new byte[11][];
70 private final List<BGPUpdateMessage> messages = new ArrayList<BGPUpdateMessage>();
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));
82 * Test if mock implementation of parser returns correct message
84 * @throws DocumentedException
85 * @throws DeserializerException
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)));
95 final BGPMessageParserMock mockParser = new BGPMessageParserMock(updateMap);
97 for (int i = 0; i < this.inputBytes.length; i++) {
98 assertEquals(this.messages.get(i), mockParser.parse(this.inputBytes[i]).get(0));
100 assertThat(this.messages.get(3), not(mockParser.parse(this.inputBytes[8]).get(0)));
104 * Test if method throws IllegalArgumentException after finding no BGPUpdateMessage associated with given byte[] key
106 * @throws DocumentedException
107 * @throws DeserializerException
108 * @throws IOException
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)));
117 final BGPMessageParserMock mockParser = new BGPMessageParserMock(updateMap);
118 mockParser.parse(new byte[] { 7, 4, 6 });
122 * Helper method to fill inputBytes variable
124 * @param fileNumber parameter to distinguish between files from which bytes are read
126 private byte[] fillInputBytes(final int fileNumber) throws Exception {
128 final InputStream is = this.getClass().getResourceAsStream("/up" + fileNumber + ".bin");
129 final ByteArrayOutputStream bis = new ByteArrayOutputStream();
130 final byte[] data = new byte[60];
133 while ((nRead = is.read(data, 0, data.length)) != -1) {
134 bis.write(data, 0, nRead);
137 return bis.toByteArray();
141 * Helper method to fill messages variable
143 * @param asn this parameter is passed to ASNumber constructor
145 private BGPUpdateMessage fillMessages(final long asn) throws UnknownHostException {
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();
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);
157 final Set<BGPObject> addedObjects = new HashSet<BGPObject>();
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);
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);
169 return new BGPUpdateMessageImpl(addedObjects, Collections.<Identifier> emptySet());
173 public void testGetOpenMessage() throws DeserializerException, DocumentedException, IOException {
174 final Map<byte[], List<Notification>> openMap = Maps.newHashMap();
176 final Set<BGPTableType> type = Sets.newHashSet();
177 type.add(new BGPTableType(Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class));
179 final List<BGPParameter> params = Lists.newArrayList();
180 params.add(new MultiprotocolCapability(new BGPTableType(Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class)));
182 final byte[] input = new byte[] { 5, 8, 13, 21 };
184 openMap.put(input, Lists.newArrayList((Notification) new BGPOpenMessage(new AsNumber((long) 30), (short) 30, null, params)));
186 final BGPMessageParserMock mockParser = new BGPMessageParserMock(openMap);
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());
195 assertEquals(type, result);