2 * Copyright (c) 2016 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.evpn.impl.nlri;
10 import static org.junit.Assert.assertArrayEquals;
11 import static org.junit.Assert.assertEquals;
12 import static org.opendaylight.protocol.bgp.evpn.impl.EvpnTestUtil.RD;
13 import static org.opendaylight.protocol.bgp.evpn.impl.EvpnTestUtil.RD_MODEL;
14 import static org.opendaylight.protocol.bgp.evpn.impl.EvpnTestUtil.createValueBuilder;
15 import static org.opendaylight.protocol.bgp.evpn.impl.nlri.NlriModelUtil.RD_NID;
16 import static org.opendaylight.protocol.bgp.evpn.spi.pojo.SimpleEvpnNlriRegistryTest.EVPN_NID;
18 import io.netty.buffer.ByteBuf;
19 import io.netty.buffer.Unpooled;
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.List;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.opendaylight.protocol.bgp.evpn.impl.esi.types.ESIActivator;
26 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
27 import org.opendaylight.protocol.util.ByteArray;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.EvpnSubsequentAddressFamily;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.L2vpnAddressFamily;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.evpn.EvpnChoice;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.evpn.destination.EvpnDestination;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.evpn.destination.EvpnDestinationBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationEvpnCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.update.attributes.mp.reach.nlri.advertized.routes.destination.type.destination.evpn._case.DestinationEvpnBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpReachNlriBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpUnreachNlri;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpUnreachNlriBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.reach.nlri.AdvertizedRoutes;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.unreach.nlri.WithdrawnRoutes;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
42 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
43 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
44 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
45 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
46 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
47 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
48 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder;
50 public class EvpnNlriParserTest {
51 private static final NodeIdentifier EVPN_CHOICE_NID = new NodeIdentifier(EvpnChoice.QNAME);
52 private List<EvpnDestination> dest;
53 private EvpnNlriParser parser;
55 private static ChoiceNode createMACIpAdvChoice() {
56 final DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> choice = Builders.choiceBuilder();
57 choice.withNodeIdentifier(EVPN_CHOICE_NID);
58 return choice.addChild(MACIpAdvRParserTest.createMacIpCont()).build();
63 ESIActivator.registerEsiTypeParsers(new ArrayList<>());
64 NlriActivator.registerNlriParsers(new ArrayList<>());
65 this.dest = Collections.singletonList(new EvpnDestinationBuilder()
66 .setRouteDistinguisher(RD)
67 .setEvpnChoice(IncMultEthTagRParserTest.createIncMultiCase()).build());
68 this.parser = new EvpnNlriParser();
72 public void testSerializeNlri() {
73 final ByteBuf buffer = Unpooled.buffer();
74 EvpnNlriParser.serializeNlri(this.dest, buffer);
75 assertArrayEquals(IncMultEthTagRParserTest.RESULT, ByteArray.getAllBytes(buffer));
80 public void testMpUnreach() throws BGPParsingException {
81 final MpUnreachNlriBuilder mpReach = new MpUnreachNlriBuilder();
82 mpReach.setAfi(L2vpnAddressFamily.class);
83 mpReach.setSafi(EvpnSubsequentAddressFamily.class);
84 this.parser.parseNlri(Unpooled.wrappedBuffer(IncMultEthTagRParserTest.RESULT), mpReach, null);
85 assertEquals(createUnreach(), mpReach.build());
88 private MpUnreachNlri createUnreach() {
89 final MpUnreachNlriBuilder mpReachExpected = new MpUnreachNlriBuilder();
90 mpReachExpected.setAfi(L2vpnAddressFamily.class);
91 mpReachExpected.setSafi(EvpnSubsequentAddressFamily.class);
92 final WithdrawnRoutes wd = new WithdrawnRoutesBuilder().setDestinationType(
93 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.update
94 .attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationEvpnCaseBuilder()
95 .setDestinationEvpn(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp
96 .evpn.rev180329.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type
97 .destination.evpn._case.DestinationEvpnBuilder()
98 .setEvpnDestination(this.dest).build()).build()).build();
99 return mpReachExpected.setWithdrawnRoutes(wd).build();
103 public void testMpReach() throws BGPParsingException {
104 final MpReachNlriBuilder mpReach = new MpReachNlriBuilder();
105 mpReach.setAfi(L2vpnAddressFamily.class);
106 mpReach.setSafi(EvpnSubsequentAddressFamily.class);
107 this.parser.parseNlri(Unpooled.wrappedBuffer(IncMultEthTagRParserTest.RESULT), mpReach, null);
109 final MpReachNlriBuilder mpReachExpected = new MpReachNlriBuilder();
110 mpReachExpected.setAfi(L2vpnAddressFamily.class);
111 mpReachExpected.setSafi(EvpnSubsequentAddressFamily.class);
112 final AdvertizedRoutes wd = new AdvertizedRoutesBuilder().setDestinationType(new DestinationEvpnCaseBuilder()
113 .setDestinationEvpn(new DestinationEvpnBuilder().setEvpnDestination(this.dest).build())
115 mpReachExpected.setAdvertizedRoutes(wd);
116 assertEquals(mpReachExpected.build(), mpReach.build());
120 public void testNullMpReachNlri() throws BGPParsingException {
121 final MpReachNlriBuilder mpb = new MpReachNlriBuilder();
122 this.parser.parseNlri(Unpooled.buffer(), mpb, null);
123 assertEquals(new MpReachNlriBuilder().build(), mpb.build());
127 public void testNullMpUnReachNlri() throws BGPParsingException {
128 final MpUnreachNlriBuilder mpb = new MpUnreachNlriBuilder();
129 this.parser.parseNlri(Unpooled.buffer(), mpb, null);
130 assertEquals(new MpUnreachNlriBuilder().build(), mpb.build());
134 public void testExtractEvpnDestination() {
135 final DataContainerNodeAttrBuilder<NodeIdentifier, UnkeyedListEntryNode> evpnBI =
136 ImmutableUnkeyedListEntryNodeBuilder.create();
137 evpnBI.withNodeIdentifier(EVPN_NID);
138 evpnBI.withChild(createMACIpAdvChoice());
139 evpnBI.withChild(createValueBuilder(RD_MODEL, RD_NID).build());
140 final EvpnDestination destResult = EvpnNlriParser.extractEvpnDestination(evpnBI.build());
141 final EvpnDestination expected = new EvpnDestinationBuilder()
142 .setRouteDistinguisher(RD)
143 .setEvpnChoice(MACIpAdvRParserTest.createdExpectedResult()).build();
144 assertEquals(expected, destResult);
148 public void testExtractRouteKey() {
149 final DataContainerNodeAttrBuilder<NodeIdentifier, UnkeyedListEntryNode> evpnBI =
150 ImmutableUnkeyedListEntryNodeBuilder.create();
151 evpnBI.withNodeIdentifier(EVPN_CHOICE_NID);
152 evpnBI.withChild(createValueBuilder(RD_MODEL, RD_NID).build());
153 evpnBI.withChild(createMACIpAdvChoice());
154 final EvpnDestination destResult = EvpnNlriParser.extractRouteKeyDestination(evpnBI.build());
155 final EvpnDestination expected = new EvpnDestinationBuilder().setRouteDistinguisher(RD)
156 .setEvpnChoice(MACIpAdvRParserTest.createdExpectedRouteKey()).build();
157 assertEquals(expected, destResult);