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