Added tests for LinkstateAdjRIBsIn.
[bgpcep.git] / bgp / linkstate / src / test / java / org / opendaylight / protocol / bgp / linkstate / LinkstateAdjRIBsInTest.java
1 /*
2  * Copyright (c) 2014 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.Comparator;
15 import java.util.HashMap;
16 import java.util.List;
17
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.mockito.Matchers;
21 import org.mockito.Mock;
22 import org.mockito.Mockito;
23 import org.mockito.MockitoAnnotations;
24 import org.mockito.invocation.InvocationOnMock;
25 import org.mockito.stubbing.Answer;
26 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
27 import org.opendaylight.protocol.bgp.rib.RibReference;
28 import org.opendaylight.protocol.bgp.rib.spi.Peer;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.Identifier;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.Ipv4InterfaceIdentifier;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.NlriType;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.ProtocolId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.isis.lan.identifier.IsIsRouterIdentifierBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.CLinkstateDestination;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.CLinkstateDestinationBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.c.linkstate.destination.LinkDescriptorsBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.c.linkstate.destination.LocalNodeDescriptorsBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.c.linkstate.destination.PrefixDescriptorsBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.c.linkstate.destination.RemoteNodeDescriptorsBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.IsisPseudonodeCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonodeBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationLinkstateCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.reach.nlri.advertized.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.OriginBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpReachNlriBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlriBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpOrigin;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
65 import org.opendaylight.yangtools.yang.binding.DataObject;
66 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
67
68 public class LinkstateAdjRIBsInTest {
69
70         @Mock
71         private DataModificationTransaction trans;
72
73         @Mock
74         private RibReference rib;
75
76         @Mock
77         private Peer peer;
78
79         private LinkstateAdjRIBsIn lrib;
80
81         private CLinkstateDestinationBuilder dBuilder;
82
83         private final MpReachNlriBuilder builder = new MpReachNlriBuilder();
84
85         private final List<CLinkstateDestination> destinations = new ArrayList<>();
86
87         private final HashMap<Object, Object> data = new HashMap<>();
88
89         @Before
90         public void setUp() {
91                 MockitoAnnotations.initMocks(this);
92                 TablesKey key = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
93                 InstanceIdentifier<?> iid = InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(new RibId("test-rib"))).toInstance();
94                 Mockito.doAnswer(new Answer<String>() {
95                         @Override
96                         public String answer(final InvocationOnMock invocation) throws Throwable {
97                                 final Object[] args = invocation.getArguments();
98                                 LinkstateAdjRIBsInTest.this.data.put(args[0], args[1]);
99                                 return null;
100                         }
101
102                 }).when(this.trans).putOperationalData(Matchers.any(InstanceIdentifier.class), Matchers.any(Tables.class));
103
104                 Mockito.doAnswer(new Answer<Object>() {
105                         @Override
106                         public Object answer(final InvocationOnMock invocation) throws Throwable {
107                                 final Object[] args = invocation.getArguments();
108                                 return LinkstateAdjRIBsInTest.this.data.get(args[0]);
109                         }
110
111                 }).when(this.trans).readOperationalData(Matchers.any(InstanceIdentifier.class));
112
113                 Mockito.doAnswer(new Answer<Object>() {
114                         @Override
115                         public Object answer(final InvocationOnMock invocation) throws Throwable {
116                                 final Object[] args = invocation.getArguments();
117                                 LinkstateAdjRIBsInTest.this.data.remove(args[0]);
118                                 return null;
119                         }
120
121                 }).when(this.trans).removeOperationalData(Matchers.any(InstanceIdentifier.class));
122
123                 Mockito.doReturn(iid).when(this.rib).getInstanceIdentifier();
124                 Mockito.doReturn(new Comparator<PathAttributes>() {
125
126                         @Override
127                         public int compare(PathAttributes o1, PathAttributes o2) {
128                                 return 0;
129                         }
130                 }).when(this.peer).getComparator();
131                 Mockito.doReturn("test").when(this.peer).toString();
132                 this.lrib = new LinkstateAdjRIBsIn(this.trans, this.rib, key);
133
134                 this.dBuilder = new CLinkstateDestinationBuilder();
135
136                 this.dBuilder.setProtocolId(ProtocolId.Direct);
137                 this.dBuilder.setIdentifier(new Identifier(new BigInteger(new byte[]{5})));
138                 this.dBuilder.setLocalNodeDescriptors(new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber(35L)).build());
139         }
140
141         @Test
142         public void testAddPrefix() {
143                 this.dBuilder.setNlriType(NlriType.Ipv4Prefix);
144                 this.dBuilder.setPrefixDescriptors(new PrefixDescriptorsBuilder().setIpReachabilityInformation(new IpPrefix(new Ipv4Prefix("12.34.35.55/32"))).build());
145                 this.destinations.add(this.dBuilder.build());
146                 this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(new DestinationLinkstateCaseBuilder().setDestinationLinkstate(new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
147
148                 PathAttributesBuilder pa = new PathAttributesBuilder();
149                 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
150
151                 this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build());
152
153                 Mockito.verify(this.trans, Mockito.times(2)).putOperationalData(Matchers.any(InstanceIdentifier.class),
154                                 Matchers.any(DataObject.class));
155
156                 assertEquals(2,this.data.size());
157         }
158
159         @Test
160         public void testAddNode() {
161                 this.dBuilder.setNlriType(NlriType.Node);
162                 this.dBuilder.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder().setCRouterIdentifier(new IsisPseudonodeCaseBuilder().setIsisPseudonode(new IsisPseudonodeBuilder().setIsIsRouterIdentifier(new IsIsRouterIdentifierBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[]{1,2,3,4,5,6})).build()).build()).build()).build());
163                 this.destinations.add(this.dBuilder.build());
164                 this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(new DestinationLinkstateCaseBuilder().setDestinationLinkstate(new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
165
166                 PathAttributesBuilder pa = new PathAttributesBuilder();
167                 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
168
169                 this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build());
170
171                 Mockito.verify(this.trans, Mockito.times(2)).putOperationalData(Matchers.any(InstanceIdentifier.class),
172                                 Matchers.any(DataObject.class));
173                 assertEquals(2,this.data.size());
174         }
175
176         @Test
177         public void testAddRemoveLink() {
178                 this.dBuilder.setNlriType(NlriType.Link);
179                 this.dBuilder.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder().setCRouterIdentifier(new IsisPseudonodeCaseBuilder().setIsisPseudonode(new IsisPseudonodeBuilder().setIsIsRouterIdentifier(new IsIsRouterIdentifierBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[]{1,2,3,4,5,6})).build()).build()).build()).build());
180                 this.dBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("127.0.0.1"))).build());
181                 this.destinations.add(this.dBuilder.build());
182                 this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(new DestinationLinkstateCaseBuilder().setDestinationLinkstate(new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
183
184                 PathAttributesBuilder pa = new PathAttributesBuilder();
185                 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
186
187                 this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build());
188
189                 Mockito.verify(this.trans, Mockito.times(2)).putOperationalData(Matchers.any(InstanceIdentifier.class),
190                                 Matchers.any(DataObject.class));
191                 assertEquals(2,this.data.size());
192
193                 MpUnreachNlriBuilder builder = new MpUnreachNlriBuilder();
194                 builder.setAfi(LinkstateAddressFamily.class);
195                 builder.setSafi(LinkstateSubsequentAddressFamily.class);
196                 builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(
197                                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate(
198                                                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
199                 this.lrib.removeRoutes(this.trans, this.peer, builder.build());
200
201                 Mockito.verify(this.trans, Mockito.times(1)).removeOperationalData(Matchers.any(InstanceIdentifier.class));
202                 assertEquals(1,this.data.size());
203         }
204 }