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