Move uptodate into its own container
[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.bgp.rib.rib.LocRib;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Attributes;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.AttributesBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpOrigin;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
68 import org.opendaylight.yangtools.yang.binding.DataObject;
69 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
70
71 public class LinkstateAdjRIBsInTest {
72
73         @Mock
74         private DataModificationTransaction trans;
75
76         @Mock
77         private RibReference rib;
78
79         @Mock
80         private Peer peer;
81
82
83
84         private LinkstateAdjRIBsIn lrib;
85
86         private CLinkstateDestinationBuilder dBuilder;
87
88         private final MpReachNlriBuilder builder = new MpReachNlriBuilder();
89
90         private final List<CLinkstateDestination> destinations = new ArrayList<>();
91
92         private final HashMap<Object, Object> data = new HashMap<>();
93
94         @Before
95         public void setUp() {
96                 MockitoAnnotations.initMocks(this);
97                 TablesKey key = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
98                 final InstanceIdentifier<Rib> iid = InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(new RibId("test-rib"))).toInstance();
99                 Mockito.doAnswer(new Answer<String>() {
100                         @Override
101                         public String answer(final InvocationOnMock invocation) throws Throwable {
102                                 final Object[] args = invocation.getArguments();
103                                 LinkstateAdjRIBsInTest.this.data.put(args[0], args[1]);
104                                 return null;
105                         }
106
107                 }).when(this.trans).putOperationalData(Matchers.any(InstanceIdentifier.class), Matchers.any(Tables.class));
108
109                 Mockito.doAnswer(new Answer<Object>() {
110                         @Override
111                         public Object answer(final InvocationOnMock invocation) throws Throwable {
112                                 final Object[] args = invocation.getArguments();
113                                 Object result = LinkstateAdjRIBsInTest.this.data.get(args[0]);
114                                 if (result == null) {
115                                         InstanceIdentifier<Attributes> attrId = iid.child(LocRib.class).child(Tables.class).child(Attributes.class);
116                                         if (attrId.containsWildcarded((InstanceIdentifier<?>) args[0])) {
117                                                 result = new AttributesBuilder().setUptodate(Boolean.TRUE).build();
118                                         }
119                                 }
120
121                                 return result;
122                         }
123
124                 }).when(this.trans).readOperationalData(Matchers.any(InstanceIdentifier.class));
125
126                 Mockito.doAnswer(new Answer<Object>() {
127                         @Override
128                         public Object answer(final InvocationOnMock invocation) throws Throwable {
129                                 final Object[] args = invocation.getArguments();
130                                 LinkstateAdjRIBsInTest.this.data.remove(args[0]);
131                                 return null;
132                         }
133
134                 }).when(this.trans).removeOperationalData(Matchers.any(InstanceIdentifier.class));
135
136                 Mockito.doReturn(iid).when(this.rib).getInstanceIdentifier();
137                 Mockito.doReturn(new Comparator<PathAttributes>() {
138
139                         @Override
140                         public int compare(PathAttributes o1, PathAttributes o2) {
141                                 return 0;
142                         }
143                 }).when(this.peer).getComparator();
144                 Mockito.doReturn("test").when(this.peer).toString();
145                 this.lrib = new LinkstateAdjRIBsIn(this.trans, this.rib, key);
146
147                 this.dBuilder = new CLinkstateDestinationBuilder();
148
149                 this.dBuilder.setProtocolId(ProtocolId.Direct);
150                 this.dBuilder.setIdentifier(new Identifier(new BigInteger(new byte[]{5})));
151                 this.dBuilder.setLocalNodeDescriptors(new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber(35L)).build());
152         }
153
154         @Test
155         public void testAddPrefix() {
156                 this.dBuilder.setNlriType(NlriType.Ipv4Prefix);
157                 this.dBuilder.setPrefixDescriptors(new PrefixDescriptorsBuilder().setIpReachabilityInformation(new IpPrefix(new Ipv4Prefix("12.34.35.55/32"))).build());
158                 this.destinations.add(this.dBuilder.build());
159                 this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(new DestinationLinkstateCaseBuilder().setDestinationLinkstate(new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
160
161                 PathAttributesBuilder pa = new PathAttributesBuilder();
162                 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
163
164                 this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build());
165
166                 Mockito.verify(this.trans, Mockito.times(3)).putOperationalData(Matchers.any(InstanceIdentifier.class),
167                                 Matchers.any(DataObject.class));
168
169                 assertEquals(3,this.data.size());
170         }
171
172         @Test
173         public void testAddNode() {
174                 this.dBuilder.setNlriType(NlriType.Node);
175                 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());
176                 this.destinations.add(this.dBuilder.build());
177                 this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(new DestinationLinkstateCaseBuilder().setDestinationLinkstate(new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
178
179                 PathAttributesBuilder pa = new PathAttributesBuilder();
180                 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
181
182                 this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build());
183
184                 Mockito.verify(this.trans, Mockito.times(3)).putOperationalData(Matchers.any(InstanceIdentifier.class),
185                                 Matchers.any(DataObject.class));
186                 assertEquals(3,this.data.size());
187         }
188
189         @Test
190         public void testAddRemoveLink() {
191                 this.dBuilder.setNlriType(NlriType.Link);
192                 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());
193                 this.dBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("127.0.0.1"))).build());
194                 this.destinations.add(this.dBuilder.build());
195                 this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(new DestinationLinkstateCaseBuilder().setDestinationLinkstate(new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
196
197                 PathAttributesBuilder pa = new PathAttributesBuilder();
198                 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
199
200                 this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build());
201
202                 Mockito.verify(this.trans, Mockito.times(3)).putOperationalData(Matchers.any(InstanceIdentifier.class),
203                                 Matchers.any(DataObject.class));
204                 assertEquals(3,this.data.size());
205
206                 MpUnreachNlriBuilder builder = new MpUnreachNlriBuilder();
207                 builder.setAfi(LinkstateAddressFamily.class);
208                 builder.setSafi(LinkstateSubsequentAddressFamily.class);
209                 builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(
210                                 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(
211                                                 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());
212                 this.lrib.removeRoutes(this.trans, this.peer, builder.build());
213
214                 Mockito.verify(this.trans, Mockito.times(2)).removeOperationalData(Matchers.any(InstanceIdentifier.class));
215                 assertEquals(2,this.data.size());
216         }
217 }