BUG 5031:
[bgpcep.git] / bgp / linkstate / src / test / java / org / opendaylight / protocol / bgp / linkstate / LinkstateRIBSupportTest.java
1 /*
2  * Copyright (c) 2015 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.assertEquals;
11
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.List;
15 import org.junit.Assert;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.mockito.Mock;
19 import org.mockito.Mockito;
20 import org.mockito.MockitoAnnotations;
21 import org.mockito.invocation.InvocationOnMock;
22 import org.mockito.stubbing.Answer;
23 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
24 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
25 import org.opendaylight.protocol.bgp.linkstate.nlri.LinkstateNlriParser;
26 import org.opendaylight.protocol.bgp.linkstate.nlri.NodeNlriParser;
27 import org.opendaylight.protocol.bgp.linkstate.nlri.SimpleNlriTypeRegistry;
28 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.destination.CLinkstateDestination;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.NodeCase;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.CRouterIdentifier;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Routes;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
42 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
43 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
44 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
45 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
46 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
47 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
48 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
49 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
50 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
51 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
52 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
53 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
54 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
55 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder;
56 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListNodeBuilder;
57
58 public class LinkstateRIBSupportTest {
59
60     private static final Ipv4Address ipv4 = new Ipv4Address("42.42.42.42");
61     private static final NodeIdentifier ROUTES_NODE_ID = new NodeIdentifier(Routes.QNAME);
62     final LinkstateRIBSupport link = LinkstateRIBSupport.getInstance();
63     final List<MapEntryNode> linkList = new ArrayList<>();
64     private List<YangInstanceIdentifier> routes;
65
66     @Mock
67     private DOMDataWriteTransaction tx;
68
69     @Before
70     public void setUp() {
71         MockitoAnnotations.initMocks(this);
72         routes = new ArrayList<>();
73         Mockito.doAnswer(new Answer<Object>() {
74             @Override
75             public Object answer(final InvocationOnMock invocation) throws Throwable {
76                 final Object[] args = invocation.getArguments();
77                 LinkstateRIBSupportTest.this.routes.add((YangInstanceIdentifier) args[1]);
78                 return args[1];
79             }
80         }).when(this.tx).put(Mockito.any(LogicalDatastoreType.class), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
81
82         Mockito.doAnswer(new Answer<Object>() {
83             @Override
84             public Object answer(final InvocationOnMock invocation) throws Throwable {
85                 final Object[] args = invocation.getArguments();
86                 LinkstateRIBSupportTest.this.routes.remove(args[1]);
87                 return args[1];
88             }
89         }).when(this.tx).delete(Mockito.any(LogicalDatastoreType.class), Mockito.any(YangInstanceIdentifier.class));
90     }
91
92     @Test
93     public void testbuildReach() throws BGPParsingException {
94         final CNextHop hop = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(ipv4).build()).build();
95         final MpReachNlri result = link.buildReach(linkList, hop);
96         assertEquals(LinkstateAddressFamily.class, result.getAfi());
97         assertEquals(LinkstateSubsequentAddressFamily.class, result.getSafi());
98         assertEquals(new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("42.42.42.42")).build()).build(), result.getCNextHop());
99     }
100
101     @Test
102     public void testBuildUnreach() {
103         final MpUnreachNlri result = link.buildUnreach(linkList);
104         assertEquals(LinkstateAddressFamily.class, result.getAfi());
105         assertEquals(LinkstateSubsequentAddressFamily.class, result.getSafi());
106     }
107
108     @Test
109     public void testDestinationRoutes() {
110         final YangInstanceIdentifier yangIdentifier = YangInstanceIdentifier.of(Routes.QNAME);
111
112         final NodeNlriParser nodeParser = new NodeNlriParser();
113         SimpleNlriTypeRegistry.getInstance().registerNlriTypeSerializer(NodeCase.class, nodeParser);
114
115         final DataContainerNodeAttrBuilder<NodeIdentifier, UnkeyedListEntryNode> linkstateBI = ImmutableUnkeyedListEntryNodeBuilder.create();
116         linkstateBI.withNodeIdentifier(new NodeIdentifier(CLinkstateDestination.QNAME));
117
118         final ImmutableLeafNodeBuilder<String> protocolId = new ImmutableLeafNodeBuilder<>();
119         protocolId.withNodeIdentifier(LinkstateNlriParser.PROTOCOL_ID_NID);
120         protocolId.withValue("isis-level2");
121         linkstateBI.addChild(protocolId.build());
122
123         final ImmutableLeafNodeBuilder<BigInteger> identifier = new ImmutableLeafNodeBuilder<>();
124         identifier.withNodeIdentifier(LinkstateNlriParser.IDENTIFIER_NID);
125         identifier.withValue(BigInteger.ONE);
126         linkstateBI.addChild(identifier.build());
127
128         final DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> objectType = Builders.choiceBuilder();
129         objectType.withNodeIdentifier(LinkstateNlriParser.OBJECT_TYPE_NID);
130
131         final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> nodeDescriptors = Builders.containerBuilder();
132         nodeDescriptors.withNodeIdentifier(LinkstateNlriParser.NODE_DESCRIPTORS_NID);
133
134         final ImmutableLeafNodeBuilder<Long> asNumber = new ImmutableLeafNodeBuilder<>();
135         asNumber.withNodeIdentifier(NodeNlriParser.AS_NUMBER_NID);
136         asNumber.withValue(72L);
137         nodeDescriptors.addChild(asNumber.build());
138
139         final ImmutableLeafNodeBuilder<Long> areaID = new ImmutableLeafNodeBuilder<>();
140         areaID.withNodeIdentifier(NodeNlriParser.AREA_NID);
141         areaID.withValue(2697513L);
142         nodeDescriptors.addChild(areaID.build());
143
144         final ImmutableLeafNodeBuilder<Long> domainID = new ImmutableLeafNodeBuilder<>();
145         domainID.withNodeIdentifier(NodeNlriParser.DOMAIN_NID);
146         domainID.withValue(0x28282828L);
147         nodeDescriptors.addChild(domainID.build());
148
149         final DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> crouterId = Builders.choiceBuilder();
150         crouterId.withNodeIdentifier(new NodeIdentifier(CRouterIdentifier.QNAME));
151
152         final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> isisNode = Builders.containerBuilder();
153         isisNode.withNodeIdentifier(NodeNlriParser.ISIS_PSEUDONODE_NID);
154
155         final ImmutableLeafNodeBuilder<byte[]> isoSystemID = new ImmutableLeafNodeBuilder<>();
156         isoSystemID.withNodeIdentifier(NodeNlriParser.ISO_SYSTEM_NID);
157         isoSystemID.withValue(new byte[]{0, 0, 0, 0, 0, (byte) 0x39});
158
159         final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> isisRouter = Builders.containerBuilder();
160         isisRouter.withNodeIdentifier(NodeNlriParser.ISIS_ROUTER_NID);
161         isisRouter.addChild(isoSystemID.build());
162
163         isisNode.addChild(isisRouter.build());
164         isisNode.addChild(Builders.leafBuilder().withNodeIdentifier(NodeNlriParser.PSN_NID).withValue((short) 5).build());
165         crouterId.addChild(isisNode.build());
166
167         nodeDescriptors.addChild(crouterId.build());
168         objectType.addChild(nodeDescriptors.build());
169         linkstateBI.addChild(objectType.build());
170
171         final UnkeyedListNode routes = ImmutableUnkeyedListNodeBuilder.create()
172             .withNodeIdentifier(new NodeIdentifier(CLinkstateDestination.QNAME))
173             .addChild(linkstateBI.build())
174             .build();
175
176         final ContainerNode destination = ImmutableContainerNodeBuilder.create().
177             addChild(routes)
178             .withNodeIdentifier(new NodeIdentifier(CLinkstateDestination.QNAME))
179             .build();
180
181         final ContainerNode attributes = ImmutableContainerNodeBuilder.create()
182             .withNodeIdentifier(new NodeIdentifier(Attributes.QNAME))
183             .build();
184
185         link.putDestinationRoutes(tx, yangIdentifier, destination, attributes, ROUTES_NODE_ID);
186
187         Assert.assertEquals(1, this.routes.size());
188
189         link.deleteDestinationRoutes(tx, yangIdentifier, destination, ROUTES_NODE_ID);
190
191         Assert.assertEquals(0, this.routes.size());
192     }
193
194 }