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