c0588778bb8812f66e9dd037109d498f735ade65
[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.assertNull;
15 import static org.junit.Assert.assertTrue;
16
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;
76
77 public class LinkstateAttributeParserTest {
78
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,};
92
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 };
105
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
111         };
112
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
118         };
119
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
126         };
127
128     private RSVPExtensionProviderContext context;
129     private RSVPActivator rsvpActivator;
130     private LinkstateAttributeParser parser;
131
132     @Before
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());
138     }
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());
148     }
149
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());
159     }
160
161     @Test
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();
168
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();
174
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();
180
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();
186
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());
191     }
192
193     @Test
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();
199         assertNotNull(ls);
200
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());
226
227         //serialization
228         final ByteBuf buff = Unpooled.buffer();
229         this.parser.serializeAttribute(builder.build(), buff);
230         buff.skipBytes(3);
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));
233     }
234
235     @Test
236     public void testPositiveNodes() throws BGPParsingException {
237         final AttributesBuilder builder = createBuilder(new NodeCaseBuilder().build());
238         this.parser.parseAttribute(Unpooled.copiedBuffer(NODE_ATTR), builder);
239
240         final Attributes1 attrs = builder.getAugmentation(Attributes1.class);
241         final NodeAttributes ls = ((NodeAttributesCase) attrs.getLinkStateAttribute()).getNodeAttributes();
242         assertNotNull(ls);
243
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());
252
253         assertEquals("12K-2", ls.getDynamicHostname());
254         assertEquals(2, ls.getIsisAreaId().size());
255         assertEquals("41.41.41.41", ls.getIpv4RouterId().getValue());
256
257         //serialization
258         final ByteBuf buff = Unpooled.buffer();
259         this.parser.serializeAttribute(builder.build(), buff);
260         buff.skipBytes(3);
261         assertArrayEquals(NODE_ATTR_S, ByteArray.getAllBytes(buff));
262     }
263
264     @Test
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);
268
269         final Attributes1 attrs = builder.getAugmentation(Attributes1.class);
270         final PrefixAttributes ls = ((PrefixAttributesCase) attrs.getLinkStateAttribute()).getPrefixAttributes();
271         assertNotNull(ls);
272
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());
285
286         //serialization
287         final ByteBuf buff = Unpooled.buffer();
288         this.parser.serializeAttribute(builder.build(), buff);
289         buff.skipBytes(3);
290         // there is unresolved TLV at the end, that needs to be cut off
291         assertArrayEquals(P4_ATTR, ByteArray.getAllBytes(buff));
292     }
293
294     @Test
295     public void testPositiveTELspAttribute() throws BGPParsingException {
296         final AttributesBuilder builder = createBuilder(new TeLspCaseBuilder().build());
297         this.parser.parseAttribute(Unpooled.copiedBuffer(TE_LSP_ATTR), builder);
298
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());
309
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());
316
317         //serialization
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)));
322     }
323
324     @Test(expected=UnsupportedOperationException.class)
325     public void testLinkAttributesPrivateConstructor() throws Throwable {
326         final Constructor<LinkAttributesParser> c = LinkAttributesParser.class.getDeclaredConstructor();
327         c.setAccessible(true);
328         try {
329             c.newInstance();
330         } catch (final InvocationTargetException e) {
331             throw e.getCause();
332         }
333     }
334
335     @Test(expected=UnsupportedOperationException.class)
336     public void testNodeAttributesPrivateConstructor() throws Throwable {
337         final Constructor<NodeAttributesParser> c = NodeAttributesParser.class.getDeclaredConstructor();
338         c.setAccessible(true);
339         try {
340             c.newInstance();
341         } catch (final InvocationTargetException e) {
342             throw e.getCause();
343         }
344     }
345
346     @Test(expected=UnsupportedOperationException.class)
347     public void testPrefixAttributesPrivateConstructor() throws Throwable {
348         final Constructor<PrefixAttributesParser> c = PrefixAttributesParser.class.getDeclaredConstructor();
349         c.setAccessible(true);
350         try {
351             c.newInstance();
352         } catch (final InvocationTargetException e) {
353             throw e.getCause();
354         }
355     }
356 }