Bug 3044 - Conversion from Flowspec BI -> BA
[bgpcep.git] / bgp / rib-spi / src / test / java / org / opendaylight / protocol / bgp / rib / spi / AbstractAdjRIBsTest.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
9 package org.opendaylight.protocol.bgp.rib.spi;
10
11 import com.google.common.collect.Maps;
12 import java.util.AbstractMap;
13 import java.util.Map;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.mockito.Matchers;
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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.Ipv4Routes;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4Route;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4RouteBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4RouteKey;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Update;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes1;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.LocRib;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
48 import org.opendaylight.yangtools.yang.binding.DataObject;
49 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
50 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
51
52 public class AbstractAdjRIBsTest {
53
54     private static final AsNumber TEST_AS_NUMBER = new AsNumber(35L);
55
56     private static final Ipv4Prefix IPV4_PREFIX1 = new Ipv4Prefix("1.1.1.1/32");
57
58     private static final Ipv4Prefix IPV4_PREFIX2 = new Ipv4Prefix("2.2.2.2/32");
59
60     private static final InstanceIdentifier<Rib> RIB_IID = InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(new RibId("test-rib"))).build();
61
62     private static final KeyedInstanceIdentifier<Tables, TablesKey> TABLES_IID = RIB_IID.child(LocRib.class).child(Tables.class, new TablesKey(Ipv4AddressFamily.class,
63             UnicastSubsequentAddressFamily.class));
64
65     @Mock
66     private AdjRIBsTransaction ribsTx;
67     @Mock
68     private Peer peer;
69
70     private final Map<InstanceIdentifier<?>, Map.Entry<DataObject, Boolean>> store = Maps.newHashMap();
71
72     private final BGPObjectComparator bgpComparator = new BGPObjectComparator(TEST_AS_NUMBER);
73
74     @Before
75     public void setUp() {
76         MockitoAnnotations.initMocks(this);
77         Mockito.doReturn("").when(this.peer).toString();
78         Mockito.doReturn(this.bgpComparator).when(this.ribsTx).comparator();
79         Mockito.doAnswer(new Answer<Void>() {
80             @SuppressWarnings({ "unchecked", "rawtypes" })
81             @Override
82             public Void answer(final InvocationOnMock invocation) throws Throwable {
83                 final Object[] args = invocation.getArguments();
84                 final InstanceIdentifier<Route> ii = (InstanceIdentifier<Route>) args[2];
85                 final Route data = (Route) args[4];
86                 AbstractAdjRIBsTest.this.store.put(ii, new AbstractMap.SimpleEntry(data, false));
87                 return null;
88             }
89
90         }).when(this.ribsTx).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
91
92         Mockito.doAnswer(new Answer<Void>() {
93             @SuppressWarnings("unchecked")
94             @Override
95             public Void answer(final InvocationOnMock invocation) throws Throwable {
96                 final Object[] args = invocation.getArguments();
97                 final InstanceIdentifier<Route> ii = (InstanceIdentifier<Route>) args[2];
98                 AbstractAdjRIBsTest.this.store.remove(ii);
99                 return null;
100             }
101
102         }).when(this.ribsTx).withdraw(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any());
103
104         Mockito.doAnswer(new Answer<Void>() {
105             @SuppressWarnings("unchecked")
106             @Override
107             public Void answer(final InvocationOnMock invocation) throws Throwable {
108                 final Object[] args = invocation.getArguments();
109                 final InstanceIdentifier<Tables> basePath = (InstanceIdentifier<Tables>) args[0];
110                 final Boolean uptodate = (Boolean) args[1];
111                 @SuppressWarnings("rawtypes")
112                 final Map.Entry<DataObject, Boolean> entry = new AbstractMap.SimpleEntry(null, uptodate);
113                 AbstractAdjRIBsTest.this.store.put(basePath, entry);
114                 return null;
115             }
116         }).when(this.ribsTx).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Mockito.anyBoolean());
117     }
118
119     @Test
120     public void testAdjRibs() {
121         final TestAdjRIBs adjsRib = new TestAdjRIBs(TABLES_IID);
122         adjsRib.add(this.ribsTx, this.peer, IPV4_PREFIX1, new TestAdjRIBs.TestIpv4RIBEntryData(this.peer, new AttributesBuilder().build()));
123         Mockito.verify(this.ribsTx, Mockito.times(1)).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
124         Mockito.verify(this.ribsTx, Mockito.times(1)).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Mockito.anyBoolean());
125         Assert.assertEquals(2, this.store.size());
126         Assert.assertFalse(this.store.get(TABLES_IID).getValue());
127
128         adjsRib.markUptodate(this.ribsTx, this.peer);
129         Mockito.verify(this.ribsTx, Mockito.times(2)).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Mockito.anyBoolean());
130         Assert.assertEquals(2, this.store.size());
131         Assert.assertTrue(this.store.get(TABLES_IID).getValue());
132
133         adjsRib.remove(this.ribsTx, this.peer, IPV4_PREFIX1);
134         Mockito.verify(this.ribsTx, Mockito.times(1)).withdraw(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any());
135         Assert.assertEquals(1, this.store.size());
136
137         adjsRib.add(this.ribsTx, this.peer, IPV4_PREFIX1, new TestAdjRIBs.TestIpv4RIBEntryData(this.peer, new AttributesBuilder().build()));
138         adjsRib.add(this.ribsTx, this.peer, IPV4_PREFIX2, new TestAdjRIBs.TestIpv4RIBEntryData(this.peer, new AttributesBuilder().build()));
139         Mockito.verify(this.ribsTx, Mockito.times(3)).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
140
141         adjsRib.addAllEntries(this.ribsTx);
142         Mockito.verify(this.ribsTx, Mockito.times(5)).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
143         Assert.assertEquals(3, this.store.size());
144
145         adjsRib.clear(this.ribsTx, this.peer);
146         Mockito.verify(this.ribsTx, Mockito.times(3)).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Mockito.anyBoolean());
147         Assert.assertEquals(1, this.store.size());
148     }
149
150     @Test
151     public void testEndOfRib() {
152         final TestAdjRIBs adjsRib = new TestAdjRIBs(TABLES_IID);
153         final Update endOfRib = adjsRib.endOfRib();
154         final Attributes1 attr1 = endOfRib.getAttributes().getAugmentation(Attributes1.class);
155         Assert.assertNotNull(attr1);
156         Assert.assertEquals(Ipv4AddressFamily.class, attr1.getMpReachNlri().getAfi());
157         Assert.assertEquals(UnicastSubsequentAddressFamily.class, attr1.getMpReachNlri().getSafi());
158     }
159
160     @Test
161     public void testUpdateMsgFor() {
162         final TestAdjRIBs adjsRib = new TestAdjRIBs(TABLES_IID);
163         final Update update1 = adjsRib.updateMessageFor(IPV4_PREFIX1, new Ipv4RouteBuilder().setAttributes(new AttributesBuilder().build()).build());
164         final Attributes1 attr1 = update1.getAttributes().getAugmentation(Attributes1.class);
165         Assert.assertNotNull(attr1);
166         Assert.assertEquals(Ipv4AddressFamily.class, attr1.getMpReachNlri().getAfi());
167         Assert.assertEquals(UnicastSubsequentAddressFamily.class, attr1.getMpReachNlri().getSafi());
168
169         final Update update2 = adjsRib.updateMessageFor(IPV4_PREFIX2, null);
170         final Attributes2 attr2 = update2.getAttributes().getAugmentation(Attributes2.class);
171         Assert.assertNotNull(attr2);
172         Assert.assertEquals(Ipv4AddressFamily.class, attr2.getMpUnreachNlri().getAfi());
173         Assert.assertEquals(UnicastSubsequentAddressFamily.class, attr2.getMpUnreachNlri().getSafi());
174     }
175
176     private static final class TestAdjRIBs extends AbstractAdjRIBs<Ipv4Prefix, Ipv4Route, Ipv4RouteKey> {
177
178         private static final class TestIpv4RIBEntryData extends RIBEntryData<Ipv4Prefix, Ipv4Route, Ipv4RouteKey> {
179
180             private final Attributes attributes;
181
182             protected TestIpv4RIBEntryData(final Peer peer, final Attributes attributes) {
183                 super(peer, attributes);
184                 this.attributes = attributes;
185             }
186
187             @Override
188             protected Ipv4Route getDataObject(final Ipv4Prefix key, final Ipv4RouteKey id) {
189                 return new Ipv4RouteBuilder().setKey(id).setAttributes(new AttributesBuilder(this.attributes).build()).build();
190             }
191
192         }
193
194         protected TestAdjRIBs(final KeyedInstanceIdentifier<Tables, TablesKey> basePath) {
195             super(basePath);
196         }
197
198         @Override
199         public void addRoutes(final AdjRIBsTransaction trans, final Peer peer, final MpReachNlri nlri, final Attributes attributes) {
200             return;
201         }
202
203         @Override
204         public void removeRoutes(final AdjRIBsTransaction trans, final Peer peer, final MpUnreachNlri nlri) {
205             return;
206         }
207
208         @Override
209         public void addAdvertisement(final MpReachNlriBuilder builder, final Ipv4Route data) {
210             return;
211         }
212
213         @Override
214         protected KeyedInstanceIdentifier<Ipv4Route, Ipv4RouteKey> identifierForKey(
215                 final InstanceIdentifier<Tables> basePath, final Ipv4Prefix id) {
216             return basePath.child((Class)Ipv4Routes.class).child(Ipv4Route.class,
217                     new Ipv4RouteKey(id));
218         }
219
220         @Override
221         protected void addWithdrawal(final MpUnreachNlriBuilder builder, final Ipv4Prefix id) {
222             return;
223         }
224
225         @Override
226         public KeyedInstanceIdentifier<Ipv4Route, Ipv4RouteKey> routeIdentifier(final InstanceIdentifier<?> id) {
227             return null;
228         }
229
230         @Override
231         public Ipv4Prefix keyForIdentifier(final KeyedInstanceIdentifier<Ipv4Route, Ipv4RouteKey> id) {
232             return null;
233         }
234     }
235 }