2 * Copyright (c) 2014 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.linkstate;
10 import static org.junit.Assert.assertEquals;
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;
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;
68 public class LinkstateAdjRIBsInTest {
71 private DataModificationTransaction trans;
74 private RibReference rib;
79 private LinkstateAdjRIBsIn lrib;
81 private CLinkstateDestinationBuilder dBuilder;
83 private final MpReachNlriBuilder builder = new MpReachNlriBuilder();
85 private final List<CLinkstateDestination> destinations = new ArrayList<>();
87 private final HashMap<Object, Object> data = new HashMap<>();
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>() {
96 public String answer(final InvocationOnMock invocation) throws Throwable {
97 final Object[] args = invocation.getArguments();
98 LinkstateAdjRIBsInTest.this.data.put(args[0], args[1]);
102 }).when(this.trans).putOperationalData(Matchers.any(InstanceIdentifier.class), Matchers.any(Tables.class));
104 Mockito.doAnswer(new Answer<Object>() {
106 public Object answer(final InvocationOnMock invocation) throws Throwable {
107 final Object[] args = invocation.getArguments();
108 return LinkstateAdjRIBsInTest.this.data.get(args[0]);
111 }).when(this.trans).readOperationalData(Matchers.any(InstanceIdentifier.class));
113 Mockito.doAnswer(new Answer<Object>() {
115 public Object answer(final InvocationOnMock invocation) throws Throwable {
116 final Object[] args = invocation.getArguments();
117 LinkstateAdjRIBsInTest.this.data.remove(args[0]);
121 }).when(this.trans).removeOperationalData(Matchers.any(InstanceIdentifier.class));
123 Mockito.doReturn(iid).when(this.rib).getInstanceIdentifier();
124 Mockito.doReturn(new Comparator<PathAttributes>() {
127 public int compare(PathAttributes o1, PathAttributes o2) {
130 }).when(this.peer).getComparator();
131 Mockito.doReturn("test").when(this.peer).toString();
132 this.lrib = new LinkstateAdjRIBsIn(this.trans, this.rib, key);
134 this.dBuilder = new CLinkstateDestinationBuilder();
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());
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());
148 PathAttributesBuilder pa = new PathAttributesBuilder();
149 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
151 this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build());
153 Mockito.verify(this.trans, Mockito.times(2)).putOperationalData(Matchers.any(InstanceIdentifier.class),
154 Matchers.any(DataObject.class));
156 assertEquals(2,this.data.size());
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());
166 PathAttributesBuilder pa = new PathAttributesBuilder();
167 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
169 this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build());
171 Mockito.verify(this.trans, Mockito.times(2)).putOperationalData(Matchers.any(InstanceIdentifier.class),
172 Matchers.any(DataObject.class));
173 assertEquals(2,this.data.size());
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());
184 PathAttributesBuilder pa = new PathAttributesBuilder();
185 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
187 this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build());
189 Mockito.verify(this.trans, Mockito.times(2)).putOperationalData(Matchers.any(InstanceIdentifier.class),
190 Matchers.any(DataObject.class));
191 assertEquals(2,this.data.size());
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());
201 Mockito.verify(this.trans, Mockito.times(1)).removeOperationalData(Matchers.any(InstanceIdentifier.class));
202 assertEquals(1,this.data.size());