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.linkstate;
10 import static org.junit.Assert.assertArrayEquals;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertNull;
15 import static org.junit.Assert.assertTrue;
16 import com.google.common.collect.Lists;
17 import io.netty.buffer.ByteBuf;
18 import io.netty.buffer.Unpooled;
19 import java.lang.reflect.Constructor;
20 import java.lang.reflect.InvocationTargetException;
21 import java.util.Arrays;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.protocol.bgp.linkstate.attribute.LinkAttributesParser;
25 import org.opendaylight.protocol.bgp.linkstate.attribute.LinkstateAttributeParser;
26 import org.opendaylight.protocol.bgp.linkstate.attribute.NodeAttributesParser;
27 import org.opendaylight.protocol.bgp.linkstate.attribute.PrefixAttributesParser;
28 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
29 import org.opendaylight.protocol.rsvp.parser.impl.RSVPActivator;
30 import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext;
31 import org.opendaylight.protocol.rsvp.parser.spi.pojo.SimpleRSVPExtensionProviderContext;
32 import org.opendaylight.protocol.util.ByteArray;
33 import org.opendaylight.protocol.util.Ipv4Util;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationIpv4CaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Attributes1;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkProtectionType;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ProtocolId;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSetSids;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSetSidsBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.ObjectType;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.destination.CLinkstateDestinationBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.LinkCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.NodeCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.PrefixCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.TeLspCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.prefix._case.PrefixDescriptorsBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.LinkAttributesCase;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.NodeAttributesCase;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.PrefixAttributesCase;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.TeLspAttributesCase;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.link.attributes._case.LinkAttributes;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.node.attributes._case.NodeAttributes;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.prefix.attributes._case.PrefixAttributes;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.te.lsp.attributes._case.TeLspAttributes;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.IgpBits;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationLinkstateCaseBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.attributes.mp.reach.nlri.advertized.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes1Builder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2Builder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.Weight;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.Flags;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.IsisAdjFlagsCase;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.IsisAdjFlagsCaseBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.sid.label.index.LocalLabelCase;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.sid.label.index.SidCase;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.sid.label.index.SidCaseBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ieee754.rev130819.Float32;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.AssociationType;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.association.object.AssociationObject;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.tspec.object.TspecObject;
83 public class LinkstateAttributeParserTest {
85 static final byte[] TE_LSP_ATTR = {0x00, (byte) 0x63, 0x00, (byte) 0x30, // TE LSP Attribute Type, lenght, value
86 0x00, (byte) 0x20, (byte) 0x0c, 0x02, // Lenght, Class, Ctype
87 0x00, 0x00, 0x00, 0x07,
88 0x01, 0x00, 0x00, 0x06,
89 (byte) 0x7f, 0x00, 0x00, 0x05,
90 0x00, 0x00, 0x00, 0x01, //Token Bucket Rate
91 0x00, 0x00, 0x00, 0x02, //Token Bucket Size
92 0x00, 0x00, 0x00, 0x03, //Peak Data Rate
93 0x00, 0x00, 0x00, 0x04, //Minimum Policed Unit
94 0x00, 0x00, 0x00, 0x05, //Maximum Packet Size
95 0x00, (byte) 0x08, (byte) 0xc7, 0x01, // Lenght, Class, Ctype
96 0x00, 0x01, 0x00, 0x02,
97 0x01, 0x02, 0x03, 0x04,};
99 private static final byte[] LINK_ATTR = {0x04, 0x04, 0, 0x04, 0x2a, 0x2a, 0x2a, 0x2a, 0x04, 0x06, 0, 0x04, 0x2b, 0x2b, 0x2b, 0x2b,
100 0x04, 0x40, 0, 0x04, 0, 0, 0, 0, 0x04, 0x41, 0, 0x04, 0x49, (byte) 0x98, (byte) 0x96, (byte) 0x80, 0x04, 0x42, 0, 0x04,
101 0x46, 0x43, 0x50, 0, 0x04, 0x43, 0, 0x20, 0x46, 0x43, 0x50, 0, 0x46, 0x43, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
102 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x04, 0x44, 0, 0x08, 0, 0, 0, 0, 0, 0, 0, 0, 0x04, 0x45, 0, 0x02, 0, 0x08, 0x04, 0x46, 0, 0x01,
103 (byte) 0xc0, 0x04, 0x47, 0, 0x03, 0, 0, 0x0a, 0x04, 0x48, 0, 0x08, 0x12, 0x34, 0x56, 0x78, 0x10, 0x30, 0x50, 0x70, 0x04, 0x4a,
104 0, 0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32,
105 0x04, 0x4b, 0, 0x07, (byte)-80, 10, 0, 0, (byte)0x0f, (byte)0xff, (byte)0xff, // sr-adj
106 0x04, 0x4b, 0, 0x07, (byte)-80, 10, 0, 0, (byte)0x0f, (byte)0xff, (byte)0xef, // sr-adj
107 0x04, 0x4c, 0, 0x0d, (byte)-80, 10, 0, 0, 1, 2, 3, 4, 5, 6, (byte)0x0f, (byte)0xff, (byte)0xff, // sr-lan-adj
108 0x04, 0x4c, 0, 0x0d, (byte)-80, 10, 0, 0, 1, 2, 3, 4, 5, 6, (byte)0x0f, (byte)0xff, (byte)0xef, // sr-lan-adj
109 0x04, 0x4d, 0, 0x08, 0, 0x05, 0, 0, 0x0a, 0x0b, 0x0c, 0x0d, // peer-node-sid
110 0x04, 0x4e, 0, 0x08, 0, 0x05, 0, 0, 0x0a, 0x0b, 0x0c, 0x0f, // peer-adj-sid
111 0x04, 0x4f, 0, 0x08, 0, 0x05, 0, 0, 0x0a, 0x0b, 0x0c, 0x0e, // peer-set-sid
112 0x04, (byte) 0x88, 0, 0x01, 0x0a };
114 private static final byte[] NODE_ATTR = { 0x01, 0x07, 0, 0x04, 0, 0x2a, 0, 0x2b, 0x04, 0, 0, 0x01, (byte) 0xbc, 0x04, 0x02, 0,
115 0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32, 0x04, 0x03, 0, 0x01, 0x72, 0x04, 0x03, 0, 0x01, 0x73, 0x04, 0x04, 0, 0x04,
116 0x29, 0x29, 0x29, 0x29, 0x04, (byte) 0x88, 0, 0x01, 0x0a,
117 4, 0x0a, 0, 0x0c, (byte)0xe0, 0, 1, 2, 3, 4, (byte)0x89, 0, 3, 1, 2, 0, // sr-caps
118 4, 0x0b, 0, 2, 0, 1 // sr-algorythms
121 private static final byte[] NODE_ATTR_S = { 0x01, 0x07, 0, 0x04, 0, 0x2a, 0, 0x2b, 0x04, 0, 0, 0x01, (byte) 0xbc, 0x04, 0x02, 0,
122 0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32, 0x04, 0x03, 0, 0x01, 0x72, 0x04, 0x03, 0, 0x01, 0x73, 0x04, 0x04, 0, 0x04,
123 0x29, 0x29, 0x29, 0x29,
124 4, 0x0a, 0, 0x0c, (byte)0xe0, 0, 1, 2, 3, 4, (byte)0x89, 0, 3, 1, 2, 0, // sr-caps
125 4, 0x0b, 0, 2, 0, 1 // sr-algorythms
128 private static final byte[] P4_ATTR = { 0x04, (byte) 0x80, 0, 0x01, (byte) 0xF0, 0x04, (byte) 0x81, 0, 0x08, 0x12, 0x34, 0x56, 0x78,
129 0x10, 0x30, 0x50, 0x70, 0x04, (byte) 0x82, 0, 0x08, 0x12, 0x34, 0x56, 0x78, 0x10, 0x30, 0x50, 0x70,
130 0x04, (byte) 0x83, 0, 0x04, 0, 0, 0, 0x0a, 0x04, (byte) 0x84, 0, 0x04, 0x0a, 0x19, 0x02, 0x1b,
131 4, (byte)0x86, 0,8, (byte)0xf0, 0, 0,0, 1,2,3,4, // prefix-sid tlv
132 4, (byte)0x87, 0,0x0c, 0, 0, 0, 5, 4, (byte)0x89, 0, 4, 1,2,3,4, // range tlv
133 4, (byte)0x88, 0, 4, 1, (byte)0xf0, 0, 0 // binding sid tlv
136 private RSVPExtensionProviderContext context;
137 private RSVPActivator rsvpActivator;
138 private LinkstateAttributeParser parser;
141 public final void setUp() {
142 this.context = new SimpleRSVPExtensionProviderContext();
143 this.rsvpActivator = new RSVPActivator();
144 this.rsvpActivator.start(this.context);
145 this.parser = new LinkstateAttributeParser(false,this.context.getRsvpRegistry());
147 private static AttributesBuilder createBuilder(final ObjectType type) {
148 return new AttributesBuilder().addAugmentation(
149 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes1.class,
150 new Attributes1Builder().setMpReachNlri(
151 new MpReachNlriBuilder().setAfi(LinkstateAddressFamily.class).setSafi(LinkstateSubsequentAddressFamily.class).setAdvertizedRoutes(
152 new AdvertizedRoutesBuilder().setDestinationType(
153 new DestinationLinkstateCaseBuilder().setDestinationLinkstate(
154 new DestinationLinkstateBuilder().setCLinkstateDestination(
155 Lists.newArrayList(new CLinkstateDestinationBuilder().setObjectType(type).setProtocolId(ProtocolId.IsisLevel1).build())).build()).build()).build()).build()).build());
158 private static AttributesBuilder createUnreachBuilder(final ObjectType type) {
159 return new AttributesBuilder().addAugmentation(
160 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2.class,
161 new Attributes2Builder().setMpUnreachNlri(
162 new MpUnreachNlriBuilder().setAfi(LinkstateAddressFamily.class).setSafi(LinkstateSubsequentAddressFamily.class).setWithdrawnRoutes(
163 new WithdrawnRoutesBuilder().setDestinationType(
164 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate(
165 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder().setCLinkstateDestination(
166 Lists.newArrayList(new CLinkstateDestinationBuilder().setObjectType(type).setProtocolId(ProtocolId.IsisLevel1).build())).build()).build()).build()).build()).build());
170 public void testGetNlriType() throws BGPParsingException {
171 final ByteBuf b = Unpooled.buffer();
172 AttributesBuilder builder = new AttributesBuilder();
173 this.parser.parseAttribute(b, builder);
174 assertEquals(0, b.readableBytes());
175 builder = new AttributesBuilder();
177 final Attributes1Builder builder1 = new Attributes1Builder();
178 builder.addAugmentation(Attributes1.class, builder1.build());
179 this.parser.parseAttribute(b, builder);
180 assertEquals(0, b.readableBytes());
181 builder = new AttributesBuilder();
183 builder.addAugmentation(Attributes1.class, builder1.setMpReachNlri(
184 new MpReachNlriBuilder().setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(new DestinationIpv4CaseBuilder().build()).build()).build()).build());
185 this.parser.parseAttribute(b, builder);
186 assertEquals(0, b.readableBytes());
187 builder = new AttributesBuilder();
189 final Attributes2Builder builder2 = new Attributes2Builder();
190 builder.addAugmentation(Attributes2.class, builder2.build());
191 this.parser.parseAttribute(b, builder);
192 assertEquals(0, b.readableBytes());
193 builder = new AttributesBuilder();
195 builder.addAugmentation(Attributes2.class, builder2.setMpUnreachNlri(
196 new MpUnreachNlriBuilder().setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationIpv6CaseBuilder().build()).build()).build()).build());
197 this.parser.parseAttribute(b, builder);
198 assertEquals(0, b.readableBytes());
202 public void testPositiveLinks() throws BGPParsingException {
203 final AttributesBuilder builder = createBuilder(new LinkCaseBuilder().build());
204 this.parser.parseAttribute(Unpooled.copiedBuffer(LINK_ATTR), builder);
205 final Attributes1 attrs = builder.getAugmentation(Attributes1.class);
206 final LinkAttributes ls = ((LinkAttributesCase) attrs.getLinkStateAttribute()).getLinkAttributes();
209 assertEquals("42.42.42.42", ls.getLocalIpv4RouterId().getValue());
210 assertEquals("43.43.43.43", ls.getRemoteIpv4RouterId().getValue());
211 assertEquals(Long.valueOf(0L), ls.getAdminGroup().getValue());
212 assertArrayEquals(new byte[] { (byte) 0x49, (byte) 0x98, (byte) 0x96, (byte) 0x80 }, ls.getMaxLinkBandwidth().getValue());
213 assertArrayEquals(new byte[] { (byte) 0x46, (byte) 0x43, (byte) 0x50, (byte) 0x00 }, ls.getMaxReservableBandwidth().getValue());
214 assertNotNull(ls.getUnreservedBandwidth());
215 assertEquals(8, ls.getUnreservedBandwidth().size());
216 assertEquals(LinkProtectionType.Dedicated1to1, ls.getLinkProtection());
217 assertTrue(ls.getMplsProtocol().isLdp());
218 assertTrue(ls.getMplsProtocol().isRsvpte());
219 assertEquals(new Long(10), ls.getMetric().getValue());
220 assertEquals(2, ls.getSharedRiskLinkGroups().size());
221 assertEquals(305419896, ls.getSharedRiskLinkGroups().get(0).getValue().intValue());
222 assertEquals("12K-2", ls.getLinkName());
223 final IsisAdjFlagsCase flags = new IsisAdjFlagsCaseBuilder().setAddressFamily(Boolean.TRUE).setBackup(Boolean.FALSE).setSet(Boolean.FALSE).build();
224 assertEquals(flags, ls.getSrAdjIds().get(0).getFlags());
225 assertEquals(flags, ls.getSrAdjIds().get(1).getFlags());
226 assertNull(ls.getPeerNodeSid().getFlags());
227 assertNull(ls.getPeerSetSids().get(0).getFlags());
228 assertNull(ls.getPeerAdjSid().getFlags());
229 assertEquals(new Long(1048575L), ((LocalLabelCase)ls.getSrAdjIds().get(0).getSidLabelIndex()).getLocalLabel().getValue());
230 assertEquals(new Long(1048559L), ((LocalLabelCase)ls.getSrAdjIds().get(1).getSidLabelIndex()).getLocalLabel().getValue());
231 assertEquals(new Long(168496141L), ((SidCase) ls.getPeerNodeSid().getSidLabelIndex()).getSid());
232 assertEquals(new Short("5"), ls.getPeerNodeSid().getWeight().getValue());
233 assertEquals(new Long(168496142L), ((SidCase) ls.getPeerSetSids().get(0).getSidLabelIndex()).getSid());
234 assertEquals(new Short("5"), ls.getPeerSetSids().get(0).getWeight().getValue());
235 assertEquals(new Long(168496143L), ((SidCase) ls.getPeerAdjSid().getSidLabelIndex()).getSid());
236 assertEquals(new Short("5"), ls.getPeerAdjSid().getWeight().getValue());
239 final ByteBuf buff = Unpooled.buffer();
240 this.parser.serializeAttribute(builder.build(), buff);
242 // there is unresolved TLV at the end, that needs to be cut off
244 assertArrayEquals(ByteArray.subByte(LINK_ATTR, 0, LINK_ATTR.length -5), ByteArray.getAllBytes(buff));
247 private PeerSetSids buildPeerSetSid(final Flags flags, final long sid, final short weight) {
248 return new PeerSetSidsBuilder()
250 .setWeight(new Weight(new Short(weight)))
251 .setSidLabelIndex(new SidCaseBuilder().setSid(new Long(sid)).build()).build();
255 public void testPositiveNodes() throws BGPParsingException {
256 final AttributesBuilder builder = createBuilder(new NodeCaseBuilder().build());
257 this.parser.parseAttribute(Unpooled.copiedBuffer(NODE_ATTR), builder);
259 final Attributes1 attrs = builder.getAugmentation(Attributes1.class);
260 final NodeAttributes ls = ((NodeAttributesCase) attrs.getLinkStateAttribute()).getNodeAttributes();
263 assertEquals(2, ls.getTopologyIdentifier().size());
264 assertEquals(42, ls.getTopologyIdentifier().get(0).getValue().intValue());
265 assertTrue(ls.getNodeFlags().isOverload());
266 assertFalse(ls.getNodeFlags().isAttached());
267 assertTrue(ls.getNodeFlags().isExternal());
268 assertTrue(ls.getNodeFlags().isAbr());
269 assertTrue(ls.getNodeFlags().isRouter());
270 assertTrue(ls.getNodeFlags().isV6());
272 assertEquals("12K-2", ls.getDynamicHostname());
273 assertEquals(2, ls.getIsisAreaId().size());
274 assertEquals("41.41.41.41", ls.getIpv4RouterId().getValue());
277 final ByteBuf buff = Unpooled.buffer();
278 this.parser.serializeAttribute(builder.build(), buff);
280 assertArrayEquals(NODE_ATTR_S, ByteArray.getAllBytes(buff));
284 public void testPositiveV4Prefixes() throws BGPParsingException {
285 final AttributesBuilder builder = createUnreachBuilder(new PrefixCaseBuilder().setPrefixDescriptors(new PrefixDescriptorsBuilder().setIpReachabilityInformation(new IpPrefix(new Ipv4Prefix("127.0.0.1/32"))).build()).build());
286 this.parser.parseAttribute(Unpooled.copiedBuffer(P4_ATTR), builder);
288 final Attributes1 attrs = builder.getAugmentation(Attributes1.class);
289 final PrefixAttributes ls = ((PrefixAttributesCase) attrs.getLinkStateAttribute()).getPrefixAttributes();
292 assertNotNull(ls.getSrRange());
293 assertFalse(ls.getSrRange().isInterArea());
294 assertEquals(1, ls.getSrRange().getSubTlvs().size());
295 assertNotNull(ls.getSrBindingSidLabels());
296 final IgpBits ispBits = ls.getIgpBits();
297 assertTrue(ispBits.getUpDown().isUpDown());
298 assertTrue(ispBits.isIsIsUpDown());
299 assertTrue(ispBits.isOspfNoUnicast());
300 assertTrue(ispBits.isOspfLocalAddress());
301 assertTrue(ispBits.isOspfPropagateNssa());
302 assertEquals(2, ls.getRouteTags().size());
303 assertArrayEquals(new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 }, ls.getRouteTags().get(0).getValue());
304 assertEquals(1, ls.getExtendedTags().size());
305 assertArrayEquals(new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x10, (byte) 0x30, (byte) 0x50,
306 (byte) 0x70 }, ls.getExtendedTags().get(0).getValue());
307 assertEquals(10, ls.getPrefixMetric().getValue().intValue());
308 assertEquals("10.25.2.27", ls.getOspfForwardingAddress().getIpv4Address().getValue());
311 final ByteBuf buff = Unpooled.buffer();
312 this.parser.serializeAttribute(builder.build(), buff);
314 // there is unresolved TLV at the end, that needs to be cut off
315 assertArrayEquals(P4_ATTR, ByteArray.getAllBytes(buff));
319 public void testPositiveTELspAttribute() throws BGPParsingException {
320 final AttributesBuilder builder = createBuilder(new TeLspCaseBuilder().build());
321 this.parser.parseAttribute(Unpooled.copiedBuffer(TE_LSP_ATTR), builder);
323 final Attributes1 attrs = builder.getAugmentation(Attributes1.class);
324 final TeLspAttributes teLspAttributes = ((TeLspAttributesCase) attrs.getLinkStateAttribute()).getTeLspAttributes();
325 assertNotNull(teLspAttributes);
326 final TspecObject tSpec = teLspAttributes.getTspecObject();
327 assertNotNull(tSpec);
328 assertEquals(new Float32(new byte[]{(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01}), tSpec.getTokenBucketRate());
329 assertEquals(new Float32(new byte[]{(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02}), teLspAttributes.getTspecObject().getTokenBucketSize());
330 assertEquals(new Float32(new byte[]{(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03}), tSpec.getPeakDataRate());
331 assertEquals(new Long("4"), tSpec.getMinimumPolicedUnit());
332 assertEquals(new Long("5"), tSpec.getMaximumPacketSize());
334 final AssociationObject associationObject = teLspAttributes.getAssociationObject();
335 assertEquals(AssociationType.Recovery, associationObject.getAssociationType());
336 final IpAddress ipv4 = new IpAddress(Ipv4Util.addressForByteBuf(Unpooled.copiedBuffer(new byte[]{0x01, 0x02, 0x03, 0x04})));
337 assertEquals(ipv4, associationObject.getIpAddress());
338 final short associationId = 2;
339 assertEquals(associationId, associationObject.getAssociationId().shortValue());
342 final ByteBuf buff = Unpooled.buffer();
343 this.parser.serializeAttribute(builder.build(), buff);
344 assertArrayEquals(TE_LSP_ATTR, ByteArray.getAllBytes(buff));
345 assertTrue(Arrays.equals(TE_LSP_ATTR, ByteArray.getAllBytes(buff)));
348 @Test(expected=UnsupportedOperationException.class)
349 public void testLinkAttributesPrivateConstructor() throws Throwable {
350 final Constructor<LinkAttributesParser> c = LinkAttributesParser.class.getDeclaredConstructor();
351 c.setAccessible(true);
354 } catch (final InvocationTargetException e) {
359 @Test(expected=UnsupportedOperationException.class)
360 public void testNodeAttributesPrivateConstructor() throws Throwable {
361 final Constructor<NodeAttributesParser> c = NodeAttributesParser.class.getDeclaredConstructor();
362 c.setAccessible(true);
365 } catch (final InvocationTargetException e) {
370 @Test(expected=UnsupportedOperationException.class)
371 public void testPrefixAttributesPrivateConstructor() throws Throwable {
372 final Constructor<PrefixAttributesParser> c = PrefixAttributesParser.class.getDeclaredConstructor();
373 c.setAccessible(true);
376 } catch (final InvocationTargetException e) {