9d33c8e7638375666e3a394fe78d620f5d5efddf
[bgpcep.git] / bgp / linkstate / src / test / java / org / opendaylight / protocol / bgp / linkstate / LinkstateAttributeParserTest.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.linkstate;
9
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;
71
72 public class LinkstateAttributeParserTest {
73
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,};
87
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 };
99
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
105         };
106
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
112         };
113
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
120         };
121
122     private RSVPExtensionProviderContext context;
123     private RSVPActivator rsvpActivator;
124     private LinkstateAttributeParser parser;
125
126     @Before
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());
132     }
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());
142     }
143
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());
153     }
154
155     @Test
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();
162
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();
168
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();
174
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();
180
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());
185     }
186
187     @Test
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();
193         assertNotNull(ls);
194
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());
215
216         //serialization
217         final ByteBuf buff = Unpooled.buffer();
218         this.parser.serializeAttribute(builder.build(), buff);
219         buff.skipBytes(3);
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));
222     }
223
224     @Test
225     public void testPositiveNodes() throws BGPParsingException {
226         final AttributesBuilder builder = createBuilder(new NodeCaseBuilder().build());
227         this.parser.parseAttribute(Unpooled.copiedBuffer(NODE_ATTR), builder);
228
229         final Attributes1 attrs = builder.getAugmentation(Attributes1.class);
230         final NodeAttributes ls = ((NodeAttributesCase) attrs.getLinkStateAttribute()).getNodeAttributes();
231         assertNotNull(ls);
232
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());
241
242         assertEquals("12K-2", ls.getDynamicHostname());
243         assertEquals(2, ls.getIsisAreaId().size());
244         assertEquals("41.41.41.41", ls.getIpv4RouterId().getValue());
245
246         //serialization
247         final ByteBuf buff = Unpooled.buffer();
248         this.parser.serializeAttribute(builder.build(), buff);
249         buff.skipBytes(3);
250         assertArrayEquals(NODE_ATTR_S, ByteArray.getAllBytes(buff));
251     }
252
253     @Test
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);
257
258         final Attributes1 attrs = builder.getAugmentation(Attributes1.class);
259         final PrefixAttributes ls = ((PrefixAttributesCase) attrs.getLinkStateAttribute()).getPrefixAttributes();
260         assertNotNull(ls);
261
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());
273
274         //serialization
275         final ByteBuf buff = Unpooled.buffer();
276         this.parser.serializeAttribute(builder.build(), buff);
277         buff.skipBytes(3);
278         // there is unresolved TLV at the end, that needs to be cut off
279         assertArrayEquals(P4_ATTR, ByteArray.getAllBytes(buff));
280     }
281
282     @Test
283     public void testPositiveTELspAttribute() throws BGPParsingException {
284         final AttributesBuilder builder = createBuilder(new TeLspCaseBuilder().build());
285         this.parser.parseAttribute(Unpooled.copiedBuffer(TE_LSP_ATTR), builder);
286
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());
297
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());
304
305         //serialization
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)));
310     }
311
312     @Test(expected=UnsupportedOperationException.class)
313     public void testLinkAttributesPrivateConstructor() throws Throwable {
314         final Constructor<LinkAttributesParser> c = LinkAttributesParser.class.getDeclaredConstructor();
315         c.setAccessible(true);
316         try {
317             c.newInstance();
318         } catch (final InvocationTargetException e) {
319             throw e.getCause();
320         }
321     }
322
323     @Test(expected=UnsupportedOperationException.class)
324     public void testNodeAttributesPrivateConstructor() throws Throwable {
325         final Constructor<NodeAttributesParser> c = NodeAttributesParser.class.getDeclaredConstructor();
326         c.setAccessible(true);
327         try {
328             c.newInstance();
329         } catch (final InvocationTargetException e) {
330             throw e.getCause();
331         }
332     }
333
334     @Test(expected=UnsupportedOperationException.class)
335     public void testPrefixAttributesPrivateConstructor() throws Throwable {
336         final Constructor<PrefixAttributesParser> c = PrefixAttributesParser.class.getDeclaredConstructor();
337         c.setAccessible(true);
338         try {
339             c.newInstance();
340         } catch (final InvocationTargetException e) {
341             throw e.getCause();
342         }
343     }
344 }