Fix sonar complains
[bgpcep.git] / bgp / inet / src / test / java / org / opendaylight / protocol / bgp / inet / codec / Ipv4NlriParserTest.java
1 /*
2  * Copyright (c) 2015 Pantheon Technologies s.r.o. 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
9 package org.opendaylight.protocol.bgp.inet.codec;
10
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
16 import com.google.common.collect.Lists;
17 import io.netty.buffer.ByteBuf;
18 import io.netty.buffer.Unpooled;
19 import java.util.ArrayList;
20 import java.util.List;
21 import java.util.Optional;
22 import org.junit.Assert;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.mockito.Mock;
26 import org.mockito.Mockito;
27 import org.mockito.MockitoAnnotations;
28 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
29 import org.opendaylight.protocol.bgp.parser.spi.MultiPathSupport;
30 import org.opendaylight.protocol.bgp.parser.spi.PeerSpecificParserConstraint;
31 import org.opendaylight.protocol.util.Ipv4Util;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.prefixes.DestinationIpv4Builder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.prefixes.destination.ipv4.Ipv4Prefixes;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.prefixes.destination.ipv4.Ipv4PrefixesBuilder;
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.DestinationIpv4Case;
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.message.rev130919.PathId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes1;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes1Builder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2Builder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
53
54 public class Ipv4NlriParserTest {
55     private final Ipv4NlriParser parser = new Ipv4NlriParser();
56
57     private final String ipPrefix1 = "1.2.3.4/32";
58     private final String ipPrefix2 = "1.2.3.5/32";
59     private final String additionalIpWD = "1.2.3.6/32";
60
61     private final List<Ipv4Prefixes> prefixes = new ArrayList<>();
62     private final ByteBuf inputBytes = Unpooled.buffer();
63
64     private static final byte[] MP_NLRI_BYTES = new byte[] {
65         0x0, 0x0, 0x0, 0x1, 0x18, 0x1, 0x1, 0x1,
66         0x0, 0x0, 0x0, 0x2, 0x18, 0x1, 0x1, 0x1};
67
68     private static final Ipv4Prefix DESTINATION = new Ipv4Prefix("1.1.1.0/24");
69
70     private static final ArrayList<Ipv4Prefixes> PREFIXES = Lists.newArrayList(
71             createIpv4Prefix(1L, DESTINATION),
72             createIpv4Prefix(2L, DESTINATION));
73
74     private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationIpv4Case ip4caseWD;
75     private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationIpv4Case ip4caseWDWrong;
76     private DestinationIpv4Case ip4caseAD;
77     private DestinationIpv4Case ip4caseADWrong;
78
79     @Mock
80     private PeerSpecificParserConstraint constraint;
81
82     @Mock
83     private MultiPathSupport muliPathSupport;
84
85     @Before
86     public void setUp() {
87         MockitoAnnotations.initMocks(this);
88         final Ipv4Prefix prefix1 = new Ipv4Prefix(this.ipPrefix1);
89         final Ipv4Prefix prefix2 = new Ipv4Prefix(this.ipPrefix2);
90         final Ipv4Prefix wrongPrefix = new Ipv4Prefix(this.additionalIpWD);
91         this.prefixes.add(new Ipv4PrefixesBuilder().setPrefix(prefix1).build());
92         this.prefixes.add(new Ipv4PrefixesBuilder().setPrefix(prefix2).build());
93
94         this.ip4caseWD = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationIpv4CaseBuilder().setDestinationIpv4(
95                 new DestinationIpv4Builder().setIpv4Prefixes(this.prefixes).build()).build();
96         this.ip4caseAD = new DestinationIpv4CaseBuilder().setDestinationIpv4(new DestinationIpv4Builder().setIpv4Prefixes(this.prefixes).build()).build();
97
98         final ArrayList<Ipv4Prefixes> fakePrefixes = new ArrayList<>(this.prefixes);
99         fakePrefixes.add(new Ipv4PrefixesBuilder().setPrefix(wrongPrefix).build());
100         this.ip4caseWDWrong = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationIpv4CaseBuilder().setDestinationIpv4(
101                 new DestinationIpv4Builder().setIpv4Prefixes(fakePrefixes).build()).build();
102         this.ip4caseADWrong = new DestinationIpv4CaseBuilder().setDestinationIpv4(new DestinationIpv4Builder().setIpv4Prefixes(fakePrefixes).build()).build();
103
104         this.inputBytes.writeBytes(Ipv4Util.bytesForPrefixBegin(prefix1));
105         this.inputBytes.writeBytes(Ipv4Util.bytesForPrefixBegin(prefix2));
106
107         Mockito.doReturn(Optional.of(this.muliPathSupport)).when(this.constraint).getPeerConstraint(Mockito.any());
108         Mockito.doReturn(true).when(this.muliPathSupport).isTableTypeSupported(Mockito.any());
109     }
110
111     @Test
112     public void prefixesTest() {
113         assertEquals(this.ipPrefix1, this.prefixes.get(0).getPrefix().getValue());
114         assertEquals(this.ipPrefix2, this.prefixes.get(1).getPrefix().getValue());
115         assertEquals(2, this.prefixes.size());
116     }
117
118     @Test
119     public void parseUnreachedNlriTest() {
120         final MpUnreachNlriBuilder b = new MpUnreachNlriBuilder();
121         b.setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class);
122         this.parser.parseNlri(this.inputBytes, b);
123         assertNotNull("Withdrawn routes, destination type should not be null", b.getWithdrawnRoutes().getDestinationType());
124
125         assertEquals(this.ip4caseWD.hashCode(), b.getWithdrawnRoutes().getDestinationType().hashCode());
126         assertFalse(this.ip4caseWDWrong.hashCode() == b.getWithdrawnRoutes().getDestinationType().hashCode());
127
128         assertTrue(this.ip4caseWD.toString().equals(b.getWithdrawnRoutes().getDestinationType().toString()));
129         assertFalse(this.ip4caseWDWrong.toString().equals(b.getWithdrawnRoutes().getDestinationType().toString()));
130     }
131
132     @Test
133     public void parseReachedNlriTest() throws BGPParsingException {
134         final MpReachNlriBuilder b = new MpReachNlriBuilder();
135         b.setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class);
136         this.parser.parseNlri(this.inputBytes, b);
137         assertNotNull("Advertized routes, destination type should not be null", b.getAdvertizedRoutes().getDestinationType());
138
139         assertEquals(this.ip4caseAD.hashCode(), b.getAdvertizedRoutes().getDestinationType().hashCode());
140         assertFalse(this.ip4caseADWrong.hashCode() == b.getAdvertizedRoutes().getDestinationType().hashCode());
141
142         assertTrue(this.ip4caseAD.toString().equals(b.getAdvertizedRoutes().getDestinationType().toString()));
143         assertFalse(this.ip4caseADWrong.toString().equals(b.getAdvertizedRoutes().getDestinationType().toString()));
144     }
145
146     @Test
147     public void parseReachNlriMultiPathTest() {
148         final MpReachNlri mpReachNlri = new MpReachNlriBuilder().setAdvertizedRoutes(
149                 new AdvertizedRoutesBuilder().setDestinationType(
150                         new DestinationIpv4CaseBuilder().setDestinationIpv4(
151                                 new DestinationIpv4Builder().setIpv4Prefixes(
152                                         PREFIXES).build()).build()).build()).build();
153         final MpReachNlriBuilder mpReachNlriBuilder = new MpReachNlriBuilder();
154         mpReachNlriBuilder.setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class);
155         this.parser.parseNlri(Unpooled.wrappedBuffer(MP_NLRI_BYTES), mpReachNlriBuilder, this.constraint);
156         mpReachNlriBuilder.setAfi(null).setSafi(null);
157         Assert.assertEquals(mpReachNlri, mpReachNlriBuilder.build());
158
159         final Ipv4NlriParser serializer = new Ipv4NlriParser();
160         final ByteBuf output = Unpooled.buffer(MP_NLRI_BYTES.length);
161         final Attributes attributes = new AttributesBuilder().addAugmentation(Attributes1.class,
162                 new Attributes1Builder().setMpReachNlri(mpReachNlri).build()).build();
163         serializer.serializeAttribute(attributes, output);
164         Assert.assertArrayEquals(MP_NLRI_BYTES, output.array());
165     }
166
167     @Test
168     public void parseUnreachNlriMultiPathTest() {
169         final MpUnreachNlri mpUnreachNlri = new MpUnreachNlriBuilder().setWithdrawnRoutes(
170                 new WithdrawnRoutesBuilder().setDestinationType(
171                         new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationIpv4CaseBuilder().setDestinationIpv4(
172                                 new DestinationIpv4Builder().setIpv4Prefixes(
173                                         PREFIXES).build()).build()).build()).build();
174         final MpUnreachNlriBuilder mpUnreachNlriBuilder = new MpUnreachNlriBuilder();
175         mpUnreachNlriBuilder.setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class);
176         this.parser.parseNlri(Unpooled.wrappedBuffer(MP_NLRI_BYTES), mpUnreachNlriBuilder, this.constraint);
177         mpUnreachNlriBuilder.setAfi(null).setSafi(null);
178         Assert.assertEquals(mpUnreachNlri, mpUnreachNlriBuilder.build());
179
180         final Ipv4NlriParser serializer = new Ipv4NlriParser();
181         final ByteBuf output = Unpooled.buffer(MP_NLRI_BYTES.length);
182         final Attributes attributes = new AttributesBuilder().addAugmentation(Attributes2.class,
183                 new Attributes2Builder().setMpUnreachNlri(mpUnreachNlri).build()).build();
184         serializer.serializeAttribute(attributes, output);
185         Assert.assertArrayEquals(MP_NLRI_BYTES, output.array());
186     }
187
188     private static Ipv4Prefixes createIpv4Prefix(final long pathId, final Ipv4Prefix prefix) {
189         return new Ipv4PrefixesBuilder().setPathId(new PathId(pathId)).setPrefix(prefix).build();
190     }
191 }