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