Update MRI projects for Aluminium
[bgpcep.git] / bgp / rib-spi / src / test / java / org / opendaylight / protocol / bgp / rib / spi / RIBSupportTest.java
1 /*
2  * Copyright (c) 2016 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.rib.spi;
9
10 import static junit.framework.TestCase.assertFalse;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.mockito.ArgumentMatchers.any;
15 import static org.mockito.Mockito.doAnswer;
16 import static org.mockito.Mockito.doReturn;
17
18 import java.util.Collection;
19 import java.util.Collections;
20 import java.util.HashMap;
21 import java.util.HashSet;
22 import java.util.Map;
23 import java.util.Optional;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.mockito.Mockito;
27 import org.mockito.MockitoAnnotations;
28 import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
29 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
30 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractDataBrokerTestCustomizer;
31 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
32 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.UpdateBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.Attributes;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.AttributesBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.Attributes1;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.Attributes1Builder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.Attributes2;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.Attributes2Builder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.destination.DestinationType;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpReachNlri;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpReachNlriBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpUnreachNlri;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpUnreachNlriBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.reach.nlri.AdvertizedRoutes;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.unreach.nlri.WithdrawnRoutes;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.BgpRib;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.rib.LocRib;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.Tables;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.tables.Routes;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.test.rev180515.Ipv4Prefixes;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.test.rev180515.bgp.rib.rib.loc.rib.tables.routes.Ipv4RoutesCase;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.test.rev180515.ipv4.routes.Ipv4Routes;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.test.rev180515.ipv4.routes.ipv4.routes.Ipv4Route;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.Ipv4NextHopCase;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
64 import org.opendaylight.yangtools.yang.common.QName;
65 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
66 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
67 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
68 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
69 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
70 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
71 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
72 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode;
73 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
74
75 public class RIBSupportTest extends AbstractConcurrentDataBrokerTest {
76     private static final String ROUTE_KEY = "prefix";
77     private static final String PREFIX = "1.2.3.4/32";
78     private static final QName PATH_ID_QNAME = QName.create(Ipv4Route.QNAME, "path-id").intern();
79     private static final NodeIdentifierWithPredicates PREFIX_NII = NodeIdentifierWithPredicates.of(Ipv4Route.QNAME,
80         QName.create(Ipv4Route.QNAME, ROUTE_KEY).intern(), PREFIX);
81     private RIBSupportTestImp ribSupportTestImp;
82     private static final TablesKey TABLES_KEY = new TablesKey(Ipv4AddressFamily.class,
83             UnicastSubsequentAddressFamily.class);
84     private static final YangInstanceIdentifier LOC_RIB_TARGET = YangInstanceIdentifier
85             .create(YangInstanceIdentifier.of(BgpRib.QNAME)
86         .node(LocRib.QNAME).node(Tables.QNAME).node(RibSupportUtils.toYangTablesKey(TABLES_KEY)).getPathArguments());
87     private static final NodeIdentifier ROUTES_IDENTIFIER = new NodeIdentifier(Routes.QNAME);
88     private static final NodeIdentifier IPV4_ROUTES_IDENTIFIER = new NodeIdentifier(Ipv4Routes.QNAME);
89     private DataTreeCandidateNode emptyTree;
90     private DataTreeCandidateNode emptySubTree;
91     private DataTreeCandidateNode subTree;
92     private DOMDataTreeWriteTransaction tx;
93     private ContainerNode nlri;
94     private final Map<YangInstanceIdentifier, NormalizedNode<?, ?>> routesMap = new HashMap<>();
95     private ContainerNode attributes;
96     private MapEntryNode mapEntryNode;
97     private AdapterContext context;
98
99     @Before
100     public void setUp() throws Exception {
101         super.setup();
102         MockitoAnnotations.initMocks(this);
103         this.ribSupportTestImp = new RIBSupportTestImp(context.currentSerializer());
104         this.emptyTree = Mockito.mock(DataTreeCandidateNode.class);
105         this.emptySubTree = Mockito.mock(DataTreeCandidateNode.class);
106         this.subTree = Mockito.mock(DataTreeCandidateNode.class);
107         final DataTreeCandidateNode emptyNode = Mockito.mock(DataTreeCandidateNode.class);
108         final DataTreeCandidateNode node = Mockito.mock(DataTreeCandidateNode.class);
109         doReturn(Optional.empty()).when(this.emptyTree).getModifiedChild(IPV4_ROUTES_IDENTIFIER);
110
111         doReturn(Optional.of(emptyNode)).when(this.emptySubTree).getModifiedChild(IPV4_ROUTES_IDENTIFIER);
112         doReturn(Optional.empty()).when(emptyNode).getModifiedChild(new NodeIdentifier(Ipv4Route.QNAME));
113
114         doReturn(Optional.of(node)).when(this.subTree).getModifiedChild(IPV4_ROUTES_IDENTIFIER);
115         doReturn(Optional.of(node)).when(node).getModifiedChild(new NodeIdentifier(Ipv4Route.QNAME));
116         final Collection<DataTreeCandidateNode> emptyCollection = new HashSet<>();
117         doReturn(emptyCollection).when(node).getChildNodes();
118
119         this.tx = Mockito.mock(DOMDataTreeWriteTransaction.class);
120         this.nlri = Mockito.mock(ContainerNode.class);
121         this.attributes = ImmutableContainerNodeBuilder.create()
122                 .withNodeIdentifier(new NodeIdentifier(QName.create(Ipv4Routes.QNAME, Attributes.QNAME
123             .getLocalName().intern()))).build();
124         final ContainerNode destination = Mockito.mock(ContainerNode.class);
125         final ChoiceNode destinations = Mockito.mock(ChoiceNode.class);
126         final ContainerNode route = Mockito.mock(ContainerNode.class);
127         final Optional<?> optional = Optional.of(destination);
128         final Optional<?> destinationOptional = Optional.of(destinations);
129         final Optional<?> destinationsOptional = Optional.of(route);
130
131         doReturn(optional).when(this.nlri).getChild(new NodeIdentifier(WithdrawnRoutes.QNAME));
132         doReturn(optional).when(this.nlri).getChild(new NodeIdentifier(AdvertizedRoutes.QNAME));
133         doReturn(destinationOptional).when(destination).getChild(new NodeIdentifier(DestinationType.QNAME));
134         doReturn(destinationsOptional).when(destinations).getChild(new NodeIdentifier(Ipv4Prefixes.QNAME));
135         doReturn(emptyCollection).when(route).getValue();
136
137         doAnswer(invocation -> {
138             final Object[] args = invocation.getArguments();
139             this.routesMap.remove(args[1]);
140             return args[1];
141         }).when(this.tx).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class));
142         doAnswer(invocation -> {
143             final Object[] args = invocation.getArguments();
144             final NormalizedNode<?, ?> node1 = (NormalizedNode<?, ?>) args[2];
145             this.routesMap.put((YangInstanceIdentifier) args[1], node1);
146             return args[1];
147         }).when(this.tx).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class),
148                 any(NormalizedNode.class));
149
150         this.mapEntryNode = Mockito.mock(MapEntryNode.class);
151     }
152
153     @Override
154     protected final AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() {
155         final AbstractDataBrokerTestCustomizer customizer = super.createDataBrokerTestCustomizer();
156         this.context = customizer.getAdapterContext();
157         return customizer;
158     }
159
160     @Test
161     public void routesCaseClass() {
162         assertEquals(Ipv4RoutesCase.class, this.ribSupportTestImp.routesCaseClass());
163     }
164
165     @Test
166     public void routesContainerClass() {
167         assertEquals(Ipv4Routes.class, this.ribSupportTestImp.routesContainerClass());
168     }
169
170     @Test
171     public void routesListClass() {
172         assertEquals(Ipv4Route.class, this.ribSupportTestImp.routesListClass());
173     }
174
175     @Test
176     public void routeQName() {
177         assertEquals(Ipv4Route.QNAME, this.ribSupportTestImp.routeQName());
178     }
179
180     @Test
181     public void routeNid() {
182         assertEquals(new NodeIdentifier(Ipv4Route.QNAME),this.ribSupportTestImp.routeNid());
183     }
184
185     @Test
186     public void getAfi() {
187         assertEquals(Ipv4AddressFamily.class,this.ribSupportTestImp.getAfi());
188     }
189
190     @Test
191     public void getSafi() {
192         assertEquals(UnicastSubsequentAddressFamily.class,this.ribSupportTestImp.getSafi());
193     }
194
195     @Test
196     public void routesContainerIdentifier() {
197         assertEquals(IPV4_ROUTES_IDENTIFIER,this.ribSupportTestImp.routesContainerIdentifier());
198
199     }
200
201     @Test
202     public void routeAttributesIdentifier() {
203         assertEquals(new NodeIdentifier(QName.create(Ipv4Routes.QNAME,
204                 Attributes.QNAME.getLocalName().intern())),this.ribSupportTestImp.routeAttributesIdentifier());
205     }
206
207     @Test
208     public void routePath() {
209         assertEquals(LOC_RIB_TARGET.node(ROUTES_IDENTIFIER)
210                         .node(Ipv4Routes.QNAME).node(Ipv4Route.QNAME).node(PREFIX_NII),
211                 this.ribSupportTestImp.routePath(LOC_RIB_TARGET, PREFIX_NII));
212     }
213
214     @Test
215     public void changedRoutes() {
216         assertTrue(ribSupportTestImp.changedRoutes(this.emptyTree).isEmpty());
217         assertTrue(ribSupportTestImp.changedRoutes(this.emptySubTree).isEmpty());
218         assertNotNull(ribSupportTestImp.changedRoutes(this.subTree));
219     }
220
221     @Test
222     public void putRoutes() {
223         this.ribSupportTestImp.putRoutes(this.tx, LOC_RIB_TARGET, this.nlri, this.attributes);
224         assertFalse(this.routesMap.isEmpty());
225     }
226
227     @Test
228     public void deleteRoutes() {
229         this.ribSupportTestImp.deleteRoutes(this.tx, LOC_RIB_TARGET, this.nlri);
230         assertTrue(this.routesMap.isEmpty());
231     }
232
233
234     @Test
235     public void buildUpdate() {
236         final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder()
237                 .setGlobal(new Ipv4AddressNoZone("10.0.0.2")).build()).build();
238         final Attributes attr = new AttributesBuilder().setCNextHop(nextHop).build();
239         final Collection<MapEntryNode> routes = new HashSet<>();
240
241         assertEquals(new UpdateBuilder().setAttributes(new AttributesBuilder().build()).build(),
242                this.ribSupportTestImp.buildUpdate(routes, routes, attr));
243
244         routes.add(this.mapEntryNode);
245         final MpReachNlri mpReach = new MpReachNlriBuilder().setAfi(Ipv4AddressFamily.class)
246                 .setSafi(UnicastSubsequentAddressFamily.class)
247                 .setCNextHop(nextHop).setAdvertizedRoutes(new AdvertizedRoutesBuilder().build()).build();
248
249         final Attributes attMpR = new AttributesBuilder().addAugmentation(Attributes1.class,
250                 new Attributes1Builder().setMpReachNlri(mpReach).build()).build();
251         assertEquals(new UpdateBuilder().setAttributes(attMpR).build(),
252                this.ribSupportTestImp.buildUpdate(routes, Collections.emptySet(), attr));
253
254         final MpUnreachNlri mpUnreach = new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class)
255                 .setSafi(UnicastSubsequentAddressFamily.class)
256                 .setWithdrawnRoutes(new WithdrawnRoutesBuilder().build()).build();
257
258         final Attributes attMpU = new AttributesBuilder().addAugmentation(Attributes2.class,
259                 new Attributes2Builder().setMpUnreachNlri(mpUnreach).build()).build();
260         assertEquals(new UpdateBuilder().setAttributes(attMpU).build(),
261                this.ribSupportTestImp.buildUpdate(Collections.emptySet(), routes, attr));
262     }
263 }